Я пишу приложение для обработки и загрузки файла csv
на удаленный сервер. Приложение должно быть достаточно гибким, позволяя настраивать сопоставления столбцов.
Первое большое препятствие, с которым я столкнулся, — это чтение файла, во многих файлах данные начинаются с строки 5+ с некоторыми ненужными данными вверху, пример ниже:
Account: 123
----------
Date: 15/12/2011
----------
Type: Full
----------
Column1,Column2,Column3,Column4
Data1,Data2,Data3,Data4
Data1,Data2,Data3,Data4
В идеале я хотел бы получить первую строку данных, но это может быть сложно.
Я подключаюсь к файлу с помощью Jet со строкой подключения:
If (_extension = ".csv") Then
_excelconn.ConnectionString = String.Format( _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" & _
"; Extended Properties=""text;HDR=No;FMT=Delimited""", _directory)
End If
Затем получение данных через код:
If ValidateAll() Then
Try
ConnectExcel() ' Opens connection to csv/excel file
_excelcommand.CommandText = "SELECT * FROM [" & _excelsheets(_selsheet) & "]" ' Currently selected sheet, returns SELECT * FROM [1234#csv]
_excelcommand.Connection = _excelconn
_reader = _excelcommand.ExecuteReader()
While _reader.Read()
'MsgBox(_reader(0).ToString)
'Dostuff
End While
Catch ex As Exception
_errors.Add(ex.ToString)
retval = -1
End Try
End If
Это падает с исключением, так как я не могу получить доступ к reader(2)
для первых строк.
Есть ли способ в строке подключения или в операторе SELECT
указать Jet пропустить первые X строк листа? Если нет, есть ли способ обрабатывать reader.Read()
только в том случае, если номер строки больше X?
Я знаю, что это, вероятно, возможно, прочитав весь файл в массив и проанализировав оттуда или скопировав содержимое файла в новый файл csv, но если есть способ избежать этого и сделать это через jet/ado, то я бы предпочел что!
(помечено sql
, так как в запросе ado может быть решение sql
)