Чтение файла 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 ответ

Решение

Посмотрите, чтобы узнать, что вы не можете использовать

  1. FileSystemObject для чтения / записи UTF-8
  2. .ReadLine, если испорчены EOL (не CrLf или Lf)

Если ваши файлы ANSI/UTF-16 и не слишком большие, вы можете использовать

  1. .ReadAll, чтобы хлебнуть "плохой" файл
  2. Заменить CrFF на CrLf
  3. Разделить на CrLf, чтобы получить массив строк
  4. эти строки для сравнения с.ReadLines из "хорошего" файла

Если.ReadAll невозможен, вы должны написать свою собственную версию.ReadLine, которая сканирует CrLf или CrFF и возвращает данные перед этими EOL.

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