【问题标题】:Read line per line a txt file with VBS用VBS每行读取一个txt文件
【发布时间】:2014-05-12 22:13:43
【问题描述】:

我正在尝试这段代码:

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

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

【问题讨论】:

    标签: vbscript fso


    【解决方案1】:

    您的文件有有趣的 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 作为其单个元素。 .Echoing 至少看起来像 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 结尾,那么您的所有 sn-ps 都不能“一次回显所有行”。

    你的文件是来自外太空吗?

    更新评论:

    你不能read UTF-8 using the Filesystemobject。将文件转换为 UTF-16 并在 .OpenTextFile 时使用格式参数的 Unicode 选项,或者使用 ADODB 流。

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

    【讨论】:

    • 外层空间问题+1。 (我想知道为什么没有人在问题 cmets 中要求提供示例文件?)
    • 我的文件来自记事本++,大约 20.000 行,在 ANSI(使用 utf8 没有 bom 测试)在 windows 7 64 下
    • 嗯,我认为问题来自源文件,我正在使用另一个脚本创建它,该脚本使用 myFile.WriteLine(line.Item(0)) 追加一个新行我做错了吗?
    • 完美终于问题是由EndOfLine标记引起的,谢谢!
    【解决方案2】:

    您的代码似乎运行良好。我稍作改动以表明这些行实际上是逐行读取的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多