Чтение строки за строкой текстового файла с 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

Почему в обоих случаях выводит все строки сразу, и естественно я не могу работать построчно? Есть идеи?


person Mark    schedule 12.05.2014    source источник


Ответы (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 с помощью объекта Filesystem. Либо преобразуйте файл в UTF-16 и используйте параметр Unicode параметра формата, когда он .OpenTextFile, либо работайте с потоком ADODB.

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

person Ekkehard.Horner    schedule 12.05.2014
comment
+1 за вопрос о космосе. (Интересно, почему никто не попросил образец файла в комментариях к вопросу?) - person TheBlastOne; 13.05.2014
comment
мой файл исходит из блокнота ++ около 20 000 строк в ANSI (проверено с utf8 без bom) Под окнами 7 64 - person Mark; 13.05.2014
comment
Ну, я думаю, проблема связана с исходным файлом, я создаю его с помощью другого скрипта, который добавляет новую строку, используя myFile.WriteLine(line.Item(0)) m Я делаю это неправильно? - person Mark; 13.05.2014
comment
отлично, наконец, проблема была вызвана маркерами EndOfLine, спасибо! - person Mark; 13.05.2014

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

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

person xxbbcc    schedule 12.05.2014