實質上鼓勵一下吧

使用VB.NET經常需要遇到讀取檔案的問題,CSV格式是一種由逗號分開的標準文字檔格式,自然很容易在程式中遇到,把它寫成標準函數可以很容易的應用。

雖然微軟程式庫裏面已經包含了一個標準程式庫TextFieldParser,這個方法很好,使用的記憶體以及效率都很高。

因為CSV的第一行是欄位行,需要跳過不處理,所以要用LineNumber來測試,但是經過實際測試,這個方法在進入回圈的時候,LineNumber已經是2,而且最後一行讀不進來,還會有中文碼的問題。

Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser _
("c:\logs\bigfile")
    MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
    MyReader.Delimiters = New String() {vbTab}
    Dim currentRow As String()
    'Loop through all of the fields in the file.
    'If any lines are corrupt, report an error and continue parsing.
    While Not MyReader.EndOfData
        Try
            currentRow = MyReader.ReadFields()
            ' Include code here to handle the row.
        Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
            MsgBox("Line " & ex.Message & _
            " is invalid.  Skipping")
        End Try
    End While
End Using

還是用最簡單的方法,開啟ODBC的方式來讀取最保險,缺點就是會將整個檔案一次讀入記憶體內,不過通常CSV檔案不會太大,而且讀入Excel的時候有行數的限制,所以一般應用已經足夠。

Public Function ReadCSV(ByVal FullFileName As String) As DataTable
    Dim FileCsv As IO.FileInfo = My.Computer.FileSystem.GetFileInfo(FullFileName)

    Dim strConn As String = "driver={microsoft text driver (*.txt; *.csv)};dbq=" + _
                            FileCsv.DirectoryName + ";extensions=asc,csv,tab,txt;"
    Dim csvConn As New OdbcConnection(strConn)
    Dim strSql As String = "select * from " + FileCsv.Name
    Dim daCsv As New OdbcDataAdapter(strSql, csvConn)
    Dim dtCsv As New DataTable
    daCsv.Fill(dtCsv)
    Return dtCsv
End Function

創作者介紹

人生四十宅開始 二號宅

漠哥 發表在 痞客邦 留言(1) 人氣()


留言列表 (1)

發表留言
  • 天國恰恰
  • 請問使用ODBC的Function要怎用
    我要把CSV檔顯示在DataGridView上
    ReadCSV("C:\Documents and Settings\Administrator\桌面\11.csv")
    dsCsv.Tables.Add(dtCsv)
    DataGridView1.DataSource = dsCsv.Tables("1")
    我這樣做怎都沒有反應
    也沒有錯誤
  • DataGridView.DataSource可以直接接收DataTable形態,直接給他就好了。也就是說DataGridView.DataSource=ReadCSV(...)這樣就行了。
    不過最好你能夠先用excel來建立CSV檔案,這樣比較能夠得到正確的資料格式。

    漠哥 於 2009/11/24 00:23 回覆