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