我使用这样的脚本来循环文本文件中的一些数据:
Do Until objFile.AtEndOfStream
'Check if it is not a blank line; otherwise skip it
If Len(Trim(objFile.ReadLine)) > 0 Then
'Some code
end if
Loop
我每次都打印出值,它一直到文件的末尾(我可以看到它打印出每个值)但是当它到达结尾时它总是出错。我使用on error resume next
并打印出Err.Number
,我得到的错误号为Subscript out of range
。
我正在循环的文件的问题是最后一行是空白的。我知道这是因为我打开了文件,删除了最后一个空白行,然后运行代码,它工作正常。这是一个自动化过程(文件自动发送到FTP,并且该过程每天都由一个自动化任务运行)所以我无法进入并且每天手动删除最后一行。我包含If Len(Trim(objFile.ReadLine)) > 0 Then
来考虑这个空行,它在带有数据的行上工作正常,但它仍然在文件末尾引发错误。
当它到达一个空白行时,我可以得到循环结束但是我想在那里保持一个条件,因为在某些原因下,代码中间出现一个空白行。我认为弄清楚它是否真的是文件的最后一行然后结束循环会更清晰。
有什么想法吗?谢谢你的帮助!
答案 0 :(得分:3)
首先,我想问你 你是如何实际处理你读到的那条线,因为你不会将它存储在任何地方。您阅读并将其传递给Trim()
进行检查,但之后无法到达该行。
如果你还没有在循环中另一个 ReadLine
(认为这将是同一行),那么这将是一个问题,因为你可能正在阅读"空白"在 if
语句中行。它也意味着你每隔一秒就扔掉一次。
在我看来,你应该使用类似的东西:
Do Until objFile.AtEndOfStream
thisLine = objFile.ReadLine
If Len(Trim(thisLine)) > 0 Then
' Some code using thisLine, NOT another ReadLine.
End If
Loop
另一件事(一旦澄清了这个问题),你确定最后一行只包含空格吗?我认为所有trim()
都会被删除。可能是那里有其他空白区域导致您出现问题,例如 TAB 。
找出答案的一种方法是获取违规文件的副本并删除除最后几行之外的所有文件。然后,您可以在代码中插入调试语句,以查看发生了什么:
Do Until objFile.AtEndOfStream
thisLine = objFile.ReadLine
trimLine = Trim(thisLine)
MsgBox ("[" & trimLine & "] " & CStr(Len(trimLine))
If Len(Trim(thisLine)) > 0 Then
MsgBox ("Processing it...")
' Some code using thisLine, NOT another ReadLine.
End If
Loop