Импорт из файла CSV, как пропустить первые X строк

Я пишу приложение для обработки и загрузки файла 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)


person bendataclear    schedule 03.08.2012    source источник
comment
Есть несколько примеров поиска, которые могут представлять интерес: stackoverflow.com/search?q=skip+first +строки+чтение   -  person Fionnuala    schedule 03.08.2012


Ответы (1)


Нашел ответ после множества экспериментов и поисков, перешел на адаптер таблицы, код ниже:

Private _filepath As String
Private _directory As String
Private _filename As String
Private _extension As String
Private _selsheet As Integer
Private _skiprows As Integer
Private _data As New DataTable

Private _excelconn As New OleDbConnection
//Private _reader As OleDbDataReader
Private _excelcommand As New OleDbCommand
Private _excelta As New OleDbDataAdapter

_excelcommand.CommandText = "SELECT * FROM [" & _excelsheets(_selsheet) & "]"
_excelcommand.Connection = _excelconn

_excelta.SelectCommand = _excelcommand
_data = New DataTable
_excelta.Fill(_skiprows, Int32.MaxValue, _data)


For i = 0 To _data.Columns.Count - 1
    If _data.Rows(0).Item(i).ToString <> "" And IsNothing(_data.Columns(_data.Rows(0).Item(i).ToString)) Then
          _data.Columns.Item(i).ColumnName = _data.Rows(0).Item(i).ToString
    End If
Next

_data.Rows.RemoveAt(0) //removes first data row containing labels
person bendataclear    schedule 03.09.2012