Чтение файла VBS: изменить CR FF на CR LF
У меня есть TXT и CSV-файлы для чтения в строке. Строка заканчивается CR-LF
, Но в некоторых файлах есть CR
и нет LF
; вместо этого следующая физическая строка начинается с FF
, UFT 12 читает их вместе, как если бы это была одна строка. Я читаю файлы, используя fso:
Dim FileRead : Set FileRead = fso.OpenTextFile(file1)
Dim file2Read : Set file2Read = fso.OpenTextFile(file2)
FileStrR = FileRead.ReadLine
File2StrR = FileRead.ReadLine
Мне нужно сравнить каждую строку этих файлов с другим текстовым файлом:
if FileStrR = File2Str Then...
Я пытался отделить FileStrR
как массив:
FileStrA = REPLACE(FileStrR, ChrW(12),"**")
strarray = split(FileStrA,"**")
For h = 0 to UBound(strarray)
FileStr = strarray(h)
if FileStr = File2Str Then...
...
Но здесь я застрял, чтобы прочитать следующую строку из File2, чтобы сравнить с тем, что будет после FF
,
ОБНОВЛЕНИЕ Попытка SkipLine:
Do Until fileRead.AtEndOfStream
ln=ln+1
FileStrA = REPLACE(FileStrR, ChrW(12),"**")
strarray = split(FileStrA,"**")
For h = 0 to UBound(strarray)
FileStr = strarray(h)
For s=1 to (ln+h)-1
File2Read.SkipLine
Next
print ln&"-"&ln+h&"-"&h
File2Str = File2Read.ReadLine
if FileStr1 = File2Str Then...
print "F1: "&FileStr
print "F2: "&File2str
Next
Loop
В этом мире кода, строка print ln&"-"&ln+h&"-"&h
печатает правильные числа (ln должен быть номером строки, читаемой в данный момент). А вот строчка печатная (print "F1: "&FileStr & VBNewLine & "F2: "&File2str
) дает следующее:
F1: 2 | 8122 | TX |...
F2: 4 | 8123 | FG |...
Кажется даже если ln+h
равен "ln", а "h" равен 0, но fso
пропускает еще одну строку.
1 ответ
Посмотрите, чтобы узнать, что вы не можете использовать
- FileSystemObject для чтения / записи UTF-8
- .ReadLine, если испорчены EOL (не CrLf или Lf)
Если ваши файлы ANSI/UTF-16 и не слишком большие, вы можете использовать
- .ReadAll, чтобы хлебнуть "плохой" файл
- Заменить CrFF на CrLf
- Разделить на CrLf, чтобы получить массив строк
- эти строки для сравнения с.ReadLines из "хорошего" файла
Если.ReadAll невозможен, вы должны написать свою собственную версию.ReadLine, которая сканирует CrLf или CrFF и возвращает данные перед этими EOL.