AtEndOfStream 循环中的 VBScript 错误 9
VBScript Error 9 in AtEndOfStream Loop
我正在使用这样的脚本循环访问文本文件中的一些数据:
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
,我得到错误编号 9,即 Subscript out of range
。
我循环访问的文件的问题是最后一行是空白。我知道这一点是因为我打开了文件,删除了最后的空白行,然后 运行 代码,它工作正常。不过,这是一个自动化过程(文件每天都会通过自动化任务自动发送到 FTP 和进程 运行),所以我无法进入并手动摆脱最后一个每天排队。我包括了 If Len(Trim(objFile.ReadLine)) > 0 Then
来考虑这个空行,它在有数据的行上工作正常,但它仍然在文件末尾抛出错误。
当它到达一个空行时,我可以让循环结束,但我想在其中保留一个条件,以防由于某种原因在代码中间出现一个空行。我想弄清楚它是否真的是文件的最后一行然后结束循环会更清晰。
有什么想法吗?感谢您的帮助!
首先,我想问您您如何实际处理您读入的那一行,因为您没有将它存储在任何地方。您阅读它并将其传递给 Trim()
进行检查,但之后无法到达该行。
如果您在循环中还有 另一个 ReadLine
(认为那将是同一行),那将是一个问题,因为您可能正在阅读"blank" 行 在 if
语句中。这也意味着你每隔一行就扔掉一次。
在我看来你应该使用类似的东西:
Do Until objFile.AtEndOfStream
thisLine = objFile.ReadLine
If Len(Trim(thisLine)) > 0 Then
' Some code using thisLine, NOT another ReadLine.
End If
Loop
另一件事(一旦该问题得到澄清),您确定最后一行仅包含 spaces 吗? 我认为就这些 trim()
摆脱。可能是里面有other white space给你造成了问题,比如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
我正在使用这样的脚本循环访问文本文件中的一些数据:
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
,我得到错误编号 9,即 Subscript out of range
。
我循环访问的文件的问题是最后一行是空白。我知道这一点是因为我打开了文件,删除了最后的空白行,然后 运行 代码,它工作正常。不过,这是一个自动化过程(文件每天都会通过自动化任务自动发送到 FTP 和进程 运行),所以我无法进入并手动摆脱最后一个每天排队。我包括了 If Len(Trim(objFile.ReadLine)) > 0 Then
来考虑这个空行,它在有数据的行上工作正常,但它仍然在文件末尾抛出错误。
当它到达一个空行时,我可以让循环结束,但我想在其中保留一个条件,以防由于某种原因在代码中间出现一个空行。我想弄清楚它是否真的是文件的最后一行然后结束循环会更清晰。
有什么想法吗?感谢您的帮助!
首先,我想问您您如何实际处理您读入的那一行,因为您没有将它存储在任何地方。您阅读它并将其传递给 Trim()
进行检查,但之后无法到达该行。
如果您在循环中还有 另一个 ReadLine
(认为那将是同一行),那将是一个问题,因为您可能正在阅读"blank" 行 在 if
语句中。这也意味着你每隔一行就扔掉一次。
在我看来你应该使用类似的东西:
Do Until objFile.AtEndOfStream
thisLine = objFile.ReadLine
If Len(Trim(thisLine)) > 0 Then
' Some code using thisLine, NOT another ReadLine.
End If
Loop
另一件事(一旦该问题得到澄清),您确定最后一行仅包含 spaces 吗? 我认为就这些 trim()
摆脱。可能是里面有other white space给你造成了问题,比如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