0

我正在编写一个应用程序来处理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为可能sql在 ado 查询中有解决方案)

4

1 回答 1

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
于 2012-09-03T16:03:42.383 回答