中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-12 09:56
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请问怎么获得指定字符串的行数(VBS) 查看 1,081 回复 8
楼 主 请问怎么获得指定字符串的行数(VBS) 发表于 2009-08-30 13:13 ·  中国 湖南 郴州 电信
初级用户
★★
积分 87
发帖 61
注册 2008-09-18 11:32
17年会员
UID 125941
性别 男
状态 离线
一个文本如下:
a
b
c
我想查找b然后就返回2.
请问有专门的函数么?
2 发表于 2009-08-30 22:50 ·  中国 天津 联通
高级用户
★★★
据说是李先生
积分 609
发帖 400
注册 2008-04-23 15:55
18年会员
UID 116706
性别 男
状态 离线
没有专门函数。
假设你的文本文件叫做 “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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lisyofun +2 2009-08-30 23:25
3 发表于 2009-08-30 23:25 ·  中国 湖南 郴州 电信
初级用户
★★
积分 87
发帖 61
注册 2008-09-18 11:32
17年会员
UID 125941
性别 男
状态 离线
谢谢你,对我很有帮助,但是不好意思,我忘了说详细,如果字符串是包含在某一行中,要读取其所在的行数,那应该怎么写呢?
a
bsfd
c
也是查找b返回2
4 发表于 2009-08-31 02:01 ·  中国 北京 海淀区 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
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
5 发表于 2009-08-31 02:02 ·  中国 天津 联通
高级用户
★★★
据说是李先生
积分 609
发帖 400
注册 2008-04-23 15:55
18年会员
UID 116706
性别 男
状态 离线
这样吧,给你全部写成函数,行数可能找到有多个,我为了简便把返回结果做成一个用竖线分割的字符串,如果想取它里面的值你可以用 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)
6 发表于 2009-08-31 02:24 ·  中国 广东 广州 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线

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
7 发表于 2009-08-31 08:07 ·  中国 福建 三明 电信
高级用户
★★
论坛上抢劫的
积分 551
发帖 246
注册 2006-09-21 12:35
19年会员
UID 63270
状态 离线
Originally posted by everest79 at 2009-8-31 02:24:

Const file = "fds.cmd" '要查找的文件
Const fstr = "eof" '要查找的字符串
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
...

要查找的字符串是用另一个文本保存,且有多个情况下,怎么改啊!
8 发表于 2009-09-02 07:48 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
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
9 发表于 2009-09-03 04:39 ·  中国 湖南 郴州 电信
初级用户
★★
积分 87
发帖 61
注册 2008-09-18 11:32
17年会员
UID 125941
性别 男
状态 离线
谢谢各位大侠。。努力学习吸收中。。
论坛跳转: