vbscript中存在AtEndOfStream条件错误



我在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

再见。

最新更新