从CSV文件导入,如何跳过第一个X行

问题描述:

我正在编写一个应用程序来处理并将csv文件上传到远程服务器。 应用程序需要相当灵活,允许自定义列映射。从CSV文件导入,如何跳过第一个X行

的第一大障碍我来是读取文件,许多文件有数据开始行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溶液)

+0

有在搜索中有几个例子可能是有趣的:http://*.com/search?q=skip+first+rows+read – Fionnuala 2012-08-03 19:32:01

发现了大量的实验和搜索之后的答案,转移到表适配器,下面的代码:

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