2016-09-26 3 views
1

Я использую VBscript для сортировки информации в текстовом файле на листе excel. Я могу это сделать, но читается только одна строка текста, и элемент управления цикла, похоже, не переходит к следующей строке текстового файла. Я использую для этого AtEndOfStream, но, как я уже сказал, я получаю только одну строку вывода. Может кто-нибудь помочь мне выяснить, как выполнить программу до конца файла?Как определить конец текстового файла (EOF) в vbscript?

Вот код:

Set objExcel = CreateObject("Excel.Application")   'Bind to the Excel object 
objExcel.Workbooks.Add          'Create a new workbook. 
Sheet = 1             'Select the first sheet 
Set objSheet = objExcel.ActiveWorkbook.Worksheets(Sheet) 'Bind to worksheet. 
objSheet.Name = "ErrorSpreadsheet"       'Name the worksheet 
strExcelPath = "c:\scripts\ErrorSpreadsheet.xlsx"   'Set the save location 

objSheet.Range("A1:E1").Font.Bold = True 
objExcel.Columns(5).AutoFit() 
objSheet.Cells(1, 1).Value = "Date"       'Row 1 Column 1 (A) 
objSheet.Cells(1, 2).Value = "Time"       'Row 1 Column 2 (B) 
objSheet.Cells(1, 3).Value = "Category"      'Row 1 Column 3 (C) 
objSheet.Cells(1, 4).Value = "Error"      'Row 1 Column 4 (D) 
objSheet.Cells(1, 5).Value = "Index"      'Row 1 Column 5 (E) 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("c:\scripts\ErrorMsg.txt",1) 

i = 0 
r = 2 
c = 1 
j = 0 
Do While NOT objFile.AtEndOfStream 
    Redim Preserve arrFileLines(10) 
    arrFileLines(i) = objFile.ReadLine 
    text = arrFileLines(j) 
    'Dim a() 
    a = Split(text,";") 
    For Each line In a 
     objSheet.Cells(r,c).Value = a(i) 
     i = i + 1 
     c = c + 1 
    Next 
    j = j + 1 
    r = r + 1 
Loop 


objFile.Close 
objExcel.ActiveWorkbook.SaveAs strExcelPath 
objExcel.ActiveWorkbook.Close 
objExcel.Application.Quit 

Я написал код, в настоящее время таким образом, что я не получаю никаких ошибок. В моем файле excel у меня есть строка заголовка, а также одна строка разделенного текстового файла, но не любая из следующих строк. Текстовый файл записывается так:

 9/23;12:00;cat;error;236 
     9/24;12:30;cat2;error;897 
     9/24;4:06;cat5;error;23 
     9/25;3:45;cat1;error;54 
     9/26;1:09;cat6;error;18 

Так что выход я получаю в Экслах Excel Output

Может кто-то помочь мне выяснить, как добраться до конца текстового файла?

+0

Вы заметите, что, так как вы повторно 'i', вы добавляете первая строка в 'arrFileLines (0)', но во второй раз вы должны добавить строку в свой 'arrFileLines (i)', вы добавите ее в 'arrFileLines (4) из-за итерации в' For' петля, правильно? Кроме того, вы добавляете строку в 'arrFileLines (i)', но затем читаете из 'arrFileLines (j)', что может вызвать непредсказуемые проблемы. Я бы работал с 'i' (или другой лучшей именованной переменной) для' arrFileLines' и с 'j' (или, опять же, другой лучшей именованной переменной) для' a' и избегать повторного использования таких переменных, как этот –

+0

Plus, ваш 'Redim Preserve arrFileLines (10)' внутри цикла бесполезно. Для каждой итерации вы повторно объявляете 'arrFileLines' с размером 10, но сохраняете существующие данные.Вы можете либо объявить его перед циклом без 'Preserve', либо фактически работать с ним динамически, с' ReDim arrFileLines (-1) перед циклом, а затем внутри цикла вы выполняете 'ReDim Preserve arrFileLines (UBound (arrFileLines) +1) 'иметь массив с правильными размерами –

+0

@VictorMoraes Спасибо за ответ, но если я попытаюсь изменить строку arrFileLines (i) = objFile.ReadLine на arrFileLines (j) = objFile.ReadLine, то я получаю сообщение об ошибке «Подзаголовок вне диапазона:« i »в строке objSheet.Cells (r, c) .Value = a (i). Как я могу это решить? – krishna

ответ

1

Как я упоминал в комментариях, ваша проблема связана с вашими переменными, потому что вы пытаетесь их повторно использовать, но не делаете это правильно. Если вручную ходить в ваш код, вы увидите, что в первой итерации вы добавляете objFile.ReadLine к arrFileLines(0), а затем хранящей arrFileLines(0) к text
Но тогда вы идете в вашей внутренней For петли и итерации i, который оставил бы For петля как 4 после раскола.

Второй раз, когда вы идете в свой цикл, вы будете добавлять к objFile.ReadLinearrFileLines(4) и затем хранить arrFileLines(1) (который пуст) в text. Вы не получите никаких ошибок, потому что массив имеет фиксированное измерение и будет находиться внутри диапазона, пока вы не закончите прохождение вашего файла, но вы тоже не получите никаких результатов.
Вот почему я бы посоветовал вам использовать разные переменные и избежать повторного использования.
Фактически, если единственной целью является добавление значений из CSV в лист Excel, вам даже не нужно хранить objFile.ReadLine, в arrFileLines, так как вы не используете массив. Просто добавьте его прямо к Text.

Так, с несколькими модификациями, как переменной переименовании и так далее, вы бы в конечном итоге с чем-то вроде этого:

' The rest of your code, Variables declarations and so forth 

iRow = 2 ' Starting Row 
iCol = 1 ' Starting Col 

Do While Not objFile.AtEndOfStream 
    currLine = objFile.ReadLine 
    arrLine = Split(currLine, ";") 
    For Each item In arrLine 
     objSheet.Cells(iRow, iCol).Value = item 
     iCol = iCol + 1 
    Next 
    iCol = 1 ' Reset for every row 
    iRow = iRow + 1 
Loop 

' The rest of your code 
+0

Большое вам спасибо, его работа сейчас. Мне пришлось добавить дополнительную строку «iCol = 1» после цикла for, чтобы формат был правильным, но кроме этого он отлично работает. я очень ценю это!! – krishna