Board logo

标题: 请问怎么获得指定字符串的行数(VBS) [打印本页]

作者: lisyofun     时间: 2009-8-30 13:13    标题: 请问怎么获得指定字符串的行数(VBS)

一个文本如下:
a
b
c
我想查找b然后就返回2.
请问有专门的函数么?
作者: qinchun36     时间: 2009-8-30 22:50
没有专门函数。
假设你的文本文件叫做 “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 ]
作者: lisyofun     时间: 2009-8-30 23:25
谢谢你,对我很有帮助,但是不好意思,我忘了说详细,如果字符串是包含在某一行中,要读取其所在的行数,那应该怎么写呢?
a
bsfd
c
也是查找b返回2
作者: s11ss     时间: 2009-8-31 02:01

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

作者: qinchun36     时间: 2009-8-31 02:02
这样吧,给你全部写成函数,行数可能找到有多个,我为了简便把返回结果做成一个用竖线分割的字符串,如果想取它里面的值你可以用 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)

作者: everest79     时间: 2009-8-31 02:24

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

作者: lotus516     时间: 2009-8-31 08:07


  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")
...

要查找的字符串是用另一个文本保存,且有多个情况下,怎么改啊!
作者: everest79     时间: 2009-9-2 07:48


  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

作者: lisyofun     时间: 2009-9-3 04:39
谢谢各位大侠。。努力学习吸收中。。