Read line per line a txt file with VBS

后端 未结 2 1747
离开以前
离开以前 2020-12-16 19:57

I\'m trying this code:

filename = \"test.txt\"
listFile  = fso.OpenTextFile(filename).ReadAll
listLines = Split(listFile, vbCrLf)
For Each line In listLines
         


        
2条回答
  •  一生所求
    2020-12-16 20:17

    Your file has funny EndOfLine markers. Let's assume the lines are terminated by 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
    

    As you can see, .ReadLine can cope with vbLf (unix). Your Split() on .ReadAll(), however, will fail:

    >> t = goFS.OpenTextFile(fn).ReadAll()
    >> a = Split(t, vbCrLf)
    >> WScript.Echo UBound(a)
    >> WScript.Echo a(0)
    >>
    0
    a
    b
    c
    

    t does not contain a single vbCrLf, so Split() returns an array with UBound() == 0, containing t as its single element. .Echoing that will at least look like 3 (4) lines. You could Split() on vbLf, if you really need an array of lines.

    But if your files contains vbLf endings, then the .ReadLine loop should work fine.

    .ReadLine() can't cope with 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
    

    The b+cr 'overwrites' the a+cr and is then 'overwritten' by c+cr. The .ReadAll() approach will fail too, unless you use vbCr as separator.

    But if your files contains vbCr endings, then none of your snippets can "echoe(s) all lines at once".

    Does your file come from outer space?

    Update wrt comment:

    You can't read UTF-8 using the Filesystemobject. Either convert the file to UTF-16 and use the Unicode option of the format parameter when .OpenTextFile it, or work with an ADODB Stream.

    It still would be interesting to know what EOL marker is used.

提交回复
热议问题