Ошибка VBScript 9 в цикле AtEndOfStream

Я использую скрипт, подобный этому, чтобы перебрать некоторые данные в текстовом файле:

Do Until objFile.AtEndOfStream
    'Check if it is not a blank line; otherwise skip it
    If Len(Trim(objFile.ReadLine)) > 0 Then
        'Some code
    end if
Loop

Я распечатываю значения каждый раз, когда он проходит до конца файла (я вижу, что он печатает каждое значение), но когда он достигает конца, он всегда выдает ошибку. я использовал on error resume next и распечатал Err.Number и я получаю ошибку № 9, которая Subscript out of range,

Проблема с файлом, через который я зацикливаюсь, заключается в том, что последняя строка пуста. Я знаю это, потому что я открыл файл, удалил последнюю пустую строку, а затем запустил код, и он отлично работает. Хотя это автоматизированный процесс (файл автоматически отправляется на FTP, а процесс запускается автоматически каждый день), поэтому я не могу войти и вручную избавляться от последней строки каждый день. Я включил это If Len(Trim(objFile.ReadLine)) > 0 Then принять во внимание эту пустую строку, и она отлично работает на строках с данными, но все равно выдает ошибку в конце файла.

Я мог бы иметь конец цикла, когда он достигает пустой строки, но я хотел бы сохранить условие в том случае, если по какой-то причине внизу строки появляется пустая строка в середине кода. Я полагаю, будет понятнее выяснить, действительно ли это последняя строка файла, а затем завершить цикл.

Есть идеи? Спасибо за вашу помощь!

1 ответ

Решение

Прежде всего, я хотел бы спросить вас, как вы на самом деле обрабатываете ту строку, которую прочитали, поскольку вы нигде не храните ее. Вы читаете это и передаете это Trim() для проверки, но потом нет возможности добраться до этой линии.

Если у вас есть еще один ReadLine в цикле (думая, что это будет та же строка), это будет проблемой, так как вы можете читать "пустую" строку внутри if заявление. Это также будет означать, что вы выбрасываете каждую вторую строку.

Мне кажется, вы должны использовать что-то вроде:

Do Until objFile.AtEndOfStream
    thisLine = objFile.ReadLine
    If Len(Trim(thisLine)) > 0 Then
        ' Some code using thisLine, NOT another ReadLine.
    End If
Loop

Еще одна вещь (как только эта проблема выяснена), вы уверены, что последняя строка содержит только пробелы? Я думаю это все trim() избавляется от. Возможно, там есть другие пробелы, вызывающие у вас проблемы, например, TAB.

Один из способов выяснить это - взять копию оскорбительного файла и удалить все, кроме последней пары строк. Затем вы можете вставить отладочные операторы в ваш код, чтобы увидеть, что происходит:

Do Until objFile.AtEndOfStream
    thisLine = objFile.ReadLine

    trimLine = Trim(thisLine)
    MsgBox ("[" & trimLine & "] " & CStr(Len(trimLine))

    If Len(Trim(thisLine)) > 0 Then
        MsgBox ("Processing it...")

        ' Some code using thisLine, NOT another ReadLine.
    End If
Loop
Другие вопросы по тегам