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

Mar*_*ark 10 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
Run Code Online (Sandbox Code Playgroud)

或者这个:

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
Run Code Online (Sandbox Code Playgroud)

为什么在这两种情况下它同时回应所有线路,当然我无法一行一行地工作?任何的想法?

Ekk*_*ner 12

您的文件具有有趣的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
Run Code Online (Sandbox Code Playgroud)

如您所见,.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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

b + cr'覆盖'a + cr然后由c + cr'覆盖'.除非使用vbCr作为分隔符,否则.ReadAll()方法也会失败.

但是,如果您的文件包含vbCr结尾,那么您的所有片段都不能"同时回显所有行".

你的档案来自外太空吗?

更新WRT评论:

您无法使用Filesystemobject读取UTF-8.将文件转换为UTF-16并在.OpenTextFile时使用format参数的Unicode选项,或使用ADODB Stream.

知道使用什么EOL标记仍然很有趣.