我正在编写一个应用程序来处理并将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
解决方案)
答案 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