我正在尝试使用VBScript从文本文件中读取特定行。首先,我在文本文件中搜索一个特定的字符串,然后尝试读取该特定字符串上方的4 th 行。
示例:假设,我正在寻找一个字符串' CAT'在文本文件中。我在第1763行找到了这个字符串。现在,我正在尝试编写第no行的内容。 1759.我知道我没有以正确的方式循环获取字符串一旦我得到行没有。请建议。
Dim Count
Dim strline
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Users\PSi\Both.txt", ForReading)
Const ForReading = 1
Count = 0
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
Count=Count+1
If instr(strLine, "CAT") <> 0 Then
Count = Count-4
Exit Do
End If
Loop
'This section of code not working..
'Error : Input past end of file
For i=1 To Count-4
objFile.ReadLine
Next
strline = objFile.ReadLine
MsgBox strline
objFile.Close
答案 0 :(得分:0)
是的,因为你已经遍历了objFile,你到了最后,它试图回到最后。而不是尝试两次运行文件的内容,将文件保存到一个数组中,并根据需要多次浏览。
Dim a, text: a = "C:\testenv\test.log"
text = split(CreateObject("Scripting.FileSystemObject").OpenTextFile(a, 1).ReadAll, vbcrlf)
'Round 1
for i=0 to ubound(text)
'operate on each line here text(i)
next
'Round 2
for i=0 to ubound(text)
'operate on each line here text(i)
next
答案 1 :(得分:0)
您无法向后读取文件(除非您将整个文件读入数组,如果您有大文件,这可能会耗尽内存),但您可以使用ring buffer来保存以前的文件从文件中读取的n行:
filename = "C:\Users\PSi\Both.txt"
bufsize = 5 'number of lines to keep in the ring buffer
Set fso = CreateObject("Scripting.FileSystemObject")
'create and initialize ring buffer
ReDim buf(bufsize-1)
For n = 0 To UBound(buf)
buf(n) = Null
Next
i = 0
matchFound = False
'read lines into ring buffer
Set f = fso.OpenTextFile(filename)
Do Until f.AtEndOfStream Or matchFound
buf(i) = f.ReadLine
If InStr(buf(i), "CAT") > 0 Then matchFound = True
i = (i+1) Mod bufsize
Loop
f.Close
如果缓冲区已完全填充,则数组元素buf(i)
现在包含您要查找的行(从文件读取的最后一行之前的第4行)。否则,如果从文件中读取的行少于5行,则可以“快进”到第一个非null元素:
j = 0
Do While IsNull(buf(i)) And j < bufsize
i = (i+1) Mod bufsize
j = j + 1
Loop