从CSV文件导入,如何跳过前X行

时间:2012-08-03 09:39:28

标签: .net sql vb.net csv jet

我正在编写一个应用程序来处理并将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行? 如果没有,如果行号高于X,是否有办法只处理reader.Read()

我知道将整个文件读取到数组并从中解析或将文件内容复制到新的csv文件可能是可能的,但是如果有办法避免这种情况并通过jet / ado进行,那么我'我更喜欢这个!

(标记为sql,因为ado查询中可能存在sql解决方案)

1 个答案:

答案 0 :(得分:0)

经过大量实验和搜索后找到答案,转移到表适配器,代码如下:

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