我在vbs脚本中遇到了一个双循环问题。
这是脚本:
Set fso = CreateObject("Scripting.FileSystemObject")
Set sourceFile = fso.OpenTextFile("source.txt")
Set validFile = fso.OpenTextFile("valid.txt")
Set result = fso.CreateTextFile("result.txt", True)
Do while validFile.AtEndOfStream <> True
Wscript.echo validFile.AtEndOfStream
validLine = validFile.ReadLine
Do while sourceFile.AtEndOfStream <> True
sourceLine = sourceFile.ReadLine
If InStr(sourceLine,validLine) > 0 then
result.WriteLine(sourceLine)
End if
Loop
sourceFile.Close
Loop
Wscript.echo "End of script"
result.close
validFile.close
第二个循环在结束时不会重置,所以下一个第一个循环开始时,它什么也不做。sourceFile.AtEndOfStream返回的-1与0不同。我放了sourceFile.Close,它似乎做了重置,但没有附加任何内容。
谢谢你的帮助。
在循环中读取文件时,循环结束后,光标(即当前读取的文件中的位置)不会神奇地返回到文件的开头。尤其是当你在循环后关闭文件时(因为那时你甚至没有文件了)。你需要重新打开它,然后才能再次阅读。此外,我建议使用Until condition
而不是While condition <> true
,因为前者的可读性比后者好得多:
Do Until validFile.AtEndOfStream
validLine = validFile.ReadLine
Set sourceFile = fso.OpenTextFile("source.txt")
Do Until sourceFile.AtEndOfStream
...
Loop
sourceFile.Close
Loop
然而,正如Ekkehard.Horner所指出的,反复阅读一个文件通常不是一个好的性能选择。如果至少有一个文件相对较小(与可用的RAM数量相比),最好将该文件读取到数组中,并在内部循环中迭代该数组:
sourceText = Split(fso.OpenTextFile("source.txt").ReadAll, vbNewLine)
Do Until validFile.AtEndOfStream
validLine = validFile.ReadLine
For Each sourceLine In sourceText
...
Next
Loop
虽然可以读取一个(源)文件中的每一行,并在第二个文件(有效)的所有行上循环,通过打开/关闭外循环中的valid来使用源中每一行上的valid中的每行,但shouldn't
。
在对源开始循环之前,将valid的内容加载到内存中。
如果你提供了一些关于你现实世界问题的细节-你想检查来源是什么?-我们可以讨论如何和加载什么有效。
您想做什么?
我现在至少能看到一个问题。如果你做sourceFile.Close
,然后试着在下一个循环中读取它,你将无法读取,因为它是封闭的。
尝试移动此行Set sourceFile = fso.OpenTextFile("source.txt")
就在脚本的这一行之前Do while sourceFile.AtEndOfStream <> True
您将在每个循环中打开和关闭文件,这是针对valid.txt
文件中的每一行。这似乎不是一个好的练习,但如果你解释一下你的目标是什么,也许我可以帮助找到更好的方法。
Set fso = CreateObject("Scripting.FileSystemObject")
Set validFile = fso.OpenTextFile("valid.txt")
Set result = fso.CreateTextFile("result.txt", True)
sourceText = Split(fso.OpenTextFile("source.txt").ReadAll, vbNewLine)
Do until validFile.AtEndOfStream
validLine = validFile.ReadLine
For Each sourceLine In sourceText
If InStr(sourceLine,validLine) > 0 then
result.WriteLine(sourceLine)
End if
Next
Loop
Wscript.echo "Fin du traitement"
result.close
validFile.close
再见。