2015-01-22 4 views
0

Я использую сценарий, как это цикл по некоторым данным в текстовом файле:VBScript Ошибка 9 в AtEndOfStream Loop

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

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

Любые идеи? Спасибо за вашу помощь!

+0

Просьба показать остальную часть вашего кода, а также полное, неизмененное сообщение об ошибке. Не исключено, что код, который вы отправили, приведет к ошибке 'subscript out of range'. –

ответ

3

Прежде всего, я хотел бы задать вам , как вы фактически обрабатываете эту строку, которую вы читаете, так как вы ее не храните. Вы читаете его и передаете его на 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 
+0

Как я смогу распечатать это? Он выдает ошибку, когда попадает в эту строку, поэтому я даже не смог бы ответить. Запишите эту информацию? – MillerMedia

+0

@MillerMedia, я добавил к ответу, чтобы показать один способ его вывода. – paxdiablo

+0

Это было здорово, спасибо. Обе вещи, о которых вы говорили, происходили. Я дважды вызывал objLine.ReadLine, и он пропускал все остальные строки, поэтому я исправил это.Кроме того, конечная строка имеет длину 1 (фигурирует с использованием кода), поэтому это своего рода «символ» или TAB и т. Д. Я скорректировал его как> 1, так как ни одна из допустимых строк не будет только 1 символ в этом коде. Большое спасибо за Вашу помощь! – MillerMedia