中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请问怎么获得指定字符串的行数(VBS)
作者:
标题: 请问怎么获得指定字符串的行数(VBS) 上一主题 | 下一主题
lisyofun
初级用户





积分 87
发帖 61
注册 2008-9-18
状态 离线
『楼 主』:  请问怎么获得指定字符串的行数(VBS)

一个文本如下:
a
b
c
我想查找b然后就返回2.
请问有专门的函数么?

2009-8-30 13:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 2 楼』:  

没有专门函数。
假设你的文本文件叫做 “a.txt”
Const LINE_NUM=2
Const STRING_VALUE="b"
Dim fileName,lines,str,line
fileName="a.txt"
set fso=CreateObject("Scripting.FileSystemObject")

'获取行数
lines=0
set f=fso.OpenTextFile(fileName)
While not f.AtEndOfStream
f.SkipLine()
lines=lines+1
Wend
f.Close()
set f=Nothing

'得到指定行的字符串
set f=fso.OpenTextFile("a.txt")
ON ERROR RESUME NEXT
For i=2 to LINE_NUM
f.SkipLine()
Next
str=f.Readline()
f.Close()
set f=Nothing


'得到指定字符串的行
set f=fso.OpenTextFile("a.txt")
line=1
ON ERROR RESUME NEXT
While not STRING_VALUE=f.ReadLine()
line=line+1
Wend
f.Close()
set f=Nothing

msgbox "文本文件 "&fileName&" 的总行数为 "&lines&vbcrlf&vbcrlf&"第 "&LINE_NUM&" 行的字符串为 "&str&vbcrlf&vbcrlf&"字符串 "&STRING_VALUE&" 所在的行是 "&line
[ Last edited by qinchun36 on 2009-8-30 at 23:08 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 lisyofun 分数: +2  时间:2009-8-30 23:25


2009-8-30 22:50
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
lisyofun
初级用户





积分 87
发帖 61
注册 2008-9-18
状态 离线
『第 3 楼』:  

谢谢你,对我很有帮助,但是不好意思,我忘了说详细,如果字符串是包含在某一行中,要读取其所在的行数,那应该怎么写呢?
a
bsfd
c
也是查找b返回2

2009-8-30 23:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 4 楼』:  


Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.OpenTextFile("a.txt")
Do Until oFile.AtEndOfStream
        iLine = oFile.Line
        If InStr(oFile.ReadLine(), "b") <> 0 Then _
                WSH.Echo iLine
Loop


2009-8-31 02:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 5 楼』:  

这样吧,给你全部写成函数,行数可能找到有多个,我为了简便把返回结果做成一个用竖线分割的字符串,如果想取它里面的值你可以用 split(STRING, "|") 得到一个数组。
Dim fileName
fileName="a.txt"
set fso=CreateObject("Scripting.FileSystemObject")

'获取行数
Function getLines(fileName)
Dim lines
lines=0
set f=fso.OpenTextFile(fileName)
While not f.AtEndOfStream
f.SkipLine()
lines=lines+1
Wend
f.Close()
set f=Nothing
getLines=lines
End Function


'得到指定行的字符串
Function getStringAtLine(fileName, lineNumber)
Dim str
set f=fso.OpenTextFile(fileName)
ON ERROR RESUME NEXT
For i=2 to lineNumber
f.SkipLine()
Next
str=f.Readline()
f.Close()
set f=Nothing
getStringAtLine=str
End Function


'得到指定字符串的行
Function getLineNumberOfString(fileName, str)
set f=fso.OpenTextFile(fileName)
Dim line,lines,tmpStr
line=1
lines=""
While not f.AtEndOfStream
If str=f.ReadLine() Then lines=lines&"|"&line
line=line+1
Wend
f.Close()
set f=Nothing
If lines="" Then
lines="没找到"
Else
lines="所有行编号"&lines
End If
getLineNumberOfString=lines
End Function


'得到包含指定字符串的行, ignoreCase 的值:true为不区分大小写,false区分。
Function getLineNumberContainsString(fileName, str, ignoreCase)
set f=fso.OpenTextFile(fileName)
Dim line,lines,tmpStr,regEx
line=1
lines=""
set regEx=New RegExp
regEx.pattern=".*"&str&".*"
regEx.IgnoreCase=ignoreCase
While not f.AtEndOfStream
If regEx.Test(f.ReadLine()) Then lines=lines&"|"&line
line=line+1
Wend
f.Close()
set f=Nothing
If lines="" Then
lines="没找到"
Else
lines="所有行编号"&lines
End If
getLineNumberContainsString=lines
End Function


msgbox "文件 "&fileName&vbcrlf&vbcrlf _
       &"行数"&vbtab&getLines(fileName)&vbcrlf&vbcrlf _
       &"第二行"&vbtab&getStringAtLine(fileName, 2)&vbcrlf&vbcrlf _
       &"b所在"&vbtab&getLineNumberOfString(fileName, "b")&vbcrlf&vbcrlf _
       &"包含b"&vbtab&getLineNumberContainsString(fileName, "b", True)


2009-8-31 02:02
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 6 楼』:  


Const file = "fds.cmd"   '要查找的文件
Const fstr = "eof"       '要查找的字符串
Dim fso
Set fso  =  CreateObject("Scripting.FileSystemObject")
Set ffo =  fso.OpenTextFile(file,1)
Do Until(InStr(1,LCase(ffo.ReadLine),fstr))
DstLine = ffo.Line
Loop
msgbox DstLine




49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-8-31 02:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by everest79 at 2009-8-31 02:24:
[code]
Const file = "fds.cmd"   '要查找的文件
Const fstr = "eof"       '要查找的字符串
Dim fso
Set fso  =  CreateObject("Scripting.FileSystemObject")
...

要查找的字符串是用另一个文本保存,且有多个情况下,怎么改啊!

2009-8-31 08:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by lotus516 at 2009-8-31 08:07 AM:

要查找的字符串是用另一个文本保存,且有多个情况下,怎么改啊!


Const file = "fds.cmd"   '要查找的文件
Const fstr = "cker.txt"       '要查找的字符串集
Dim fso
Set fso  =  CreateObject("Scripting.FileSystemObject")
Set ffo =  fso.OpenTextFile(file,1)
Set fko =  fso.OpenTextFile(fstr,1)
Do Until fko.AtEndOfStream
    str = fko.ReadLine
    Do Until(InStr(1,LCase(ffo.ReadLine),str))
        DstLine = ffo.Line
    Loop
    msgbox str & "is" & DstLine
Loop




49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-9-2 07:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lisyofun
初级用户





积分 87
发帖 61
注册 2008-9-18
状态 离线
『第 9 楼』:  

谢谢各位大侠。。努力学习吸收中。。

2009-9-3 04:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: