用VBS读取每行一行的txt文件

时间:2014-05-12 22:13:44

标签: vbscript fso

我正在尝试此代码:

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

为什么在这两种情况下它都会同时响应所有行,当然我无法逐行工作?有什么想法吗?

2 个答案:

答案 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有助于调试每一行,因为它在读取行时显示行索引。