我正在尝试此代码:
filename = "test.txt"
listFile = fso.OpenTextFile(filename).ReadAll
listLines = Split(listFile, vbCrLf)
For Each line In listLines
WScript.Echo line
'My Stuff
Next
或者其他:
filename = "test.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(filename, ForReading)
Do Until f.AtEndOfStream
myLine = f.ReadLine
WScript.Echo myLine
'My Stuff
Loop
为什么在这两种情况下它都会同时响应所有行,当然我无法逐行工作?有什么想法吗?
答案 0 :(得分:10)
您的文件包含有趣的EndOfLine标记。我们假设这些行由vbLf终止:
>> fn = "lf.txt"
>> goFS.CreateTextFile(fn).Write Replace("a b c ", " ", vbLf)
>> set ts = goFS.OpenTextFile(fn)
>> do until ts.AtEndOfStream
>> WScript.Echo ts.ReadLine
>> loop
>>
a
b
c
如您所见,.ReadLine可以应对vbLf(unix)。但是,.ReadAll()上的Split()将失败:
>> t = goFS.OpenTextFile(fn).ReadAll()
>> a = Split(t, vbCrLf)
>> WScript.Echo UBound(a)
>> WScript.Echo a(0)
>>
0
a
b
c
t不包含单个vbCrLf,因此Split()返回一个包含UBound()== 0的数组,其中包含t作为其单个元素。 。回应至少看起来像3(4)行。如果你真的需要一个行数组,你可以在vbLf上使用Split()。
但是如果你的文件包含vbLf结尾,那么.ReadLine循环应该可以正常工作。
.ReadLine()无法应对vbCr(mac):
>> fn = "cr.txt"
>> goFS.CreateTextFile(fn).Write Replace("a b c ", " ", vbCr)
>>
>> set ts = goFS.OpenTextFile(fn)
>> do until ts.AtEndOfStream
>> WScript.Echo ts.ReadLine
>> loop
>>
c
b + cr'覆盖'a + cr然后由c + cr'覆盖'。 .ReadAll()方法也会失败,除非您使用vbCr作为分隔符。
但是如果您的文件包含vbCr结尾,那么您的所有片段都不能“同时回显所有行”。
你的文件来自外太空吗?
更新评论:
你不能read UTF-8 using the Filesystemobject。将文件转换为UTF-16并在.OpenTextFile时使用format参数的Unicode选项,或者使用ADODB Stream。
了解使用EOL标记仍然很有趣。
答案 1 :(得分:3)
您的代码似乎运行正常。我稍微改了一下,以表明这些线实际上是逐行读取的:
Set fso=CreateObject("Scripting.FileSystemObject")
filename = "test.txt"
listFile = fso.OpenTextFile(filename).ReadAll
listLines = Split(listFile, vbCrLf)
i = 0
For Each line In listLines
WScript.Echo CStr(i) + " : " + line
i = i + 1
'My Stuff
Next
我认为你的脚本中某处设置了fso
,但为了完整性我添加了额外的行。
您应该验证输入文件确实有多行以vbCrLf
分隔。计数器i
有助于调试每一行,因为它在读取行时显示行索引。