Читайте строку за строкой текстовый файл с VBS

Я пытаюсь этот код:

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 ответа

Решение

Ваш файл имеет забавные маркеры 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). Однако ваш Split() для.ReadAll () не будет выполнен:

>> 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) строки. Вы можете использовать Split() для vbLf, если вам действительно нужен массив строк.

Но если ваши файлы содержат окончания 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, то ни один из ваших фрагментов не может "отобразить все строки сразу".

Ваш файл приходит из космоса?

Обновление с комментарием:

Вы не можете прочитать UTF-8, используя объект файловой системы. Либо преобразуйте файл в UTF-16 и используйте параметр Unicode параметра format, когда он.OpenTextFile, либо работайте с потоком ADODB.

Еще было бы интересно узнать, какой маркер EOL используется.

Ваш код, кажется, работает нормально. Я немного изменил его, чтобы показать, что строки на самом деле читаются построчно:

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 помогает в отладке каждой строки, поскольку показывает индекс строки во время чтения строк.

Другие вопросы по тегам