2012-08-03 133 views
0

我正在編寫一個應用程序來處理並將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://stackoverflow.com/search?q=skip+first+rows+read – Fionnuala 2012-08-03 19:32:01

回答

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 
相關問題