1

CSVファイルを読み取ってデータテーブルを作成する機能があります。私はそれが私自身のcozであるとは主張しません。どこで手に入れたのかは覚えていませんが、いくつかの異なるソースからの組み合わせです。

値に「、」コンマが含まれるCSVを処理する必要があるまで、関数は正常に機能します。誰かがこの問題を処理するためにこれを解決するのを手伝ってもらえますか?

どうもありがとう ..

サンプルCSVファイル

    FirstName, LastName, Comment, "address, just city",
    John, Smith, "you are very good, but ugly", London,
    Britney, Spear, "I am a singer, and beautiful", New York,

私の機能

    Public Function BuildDataTable() As DataTable

    Dim myTable As DataTable = New DataTable("MyTable")
    Dim i As Integer
    Dim myRow As DataRow
    Dim fieldValues As String()
    Dim myReader As IO.StreamReader
    Dim csv2xml As New csv2xml

    Try
        'Open file and read first line to determine how many fields there are.
        myReader = File.OpenText(_fileFullPath)
        fieldValues = myReader.ReadLine().Split(_seperator)
        'Create data columns accordingly
        If _hasheader = False Then
            For i = 0 To fieldValues.Length() - 1
                myTable.Columns.Add(New DataColumn("Column(" & i & ")"))
            Next
        Else
            'if the file has header, take the first row as header for datatable
            For i = 0 To fieldValues.Length() - 1
                myTable.Columns.Add(New DataColumn(fieldValues(i).Replace(" ", "")))
            Next
        End If

        'Adding the first line of data to data table
        myRow = myTable.NewRow

        'if the csv file has not got a column header. defined by radio button list on first page by user
        'if csv file has header, then not need to read the first line
        If _hasheader = False Then
            For i = 0 To fieldValues.Length() - 1
                myRow.Item(i) = fieldValues(i).ToString
            Next
            myTable.Rows.Add(myRow)
        End If

        'Now reading the rest of the data to data table
        While myReader.Peek() <> -1
            fieldValues = myReader.ReadLine().Split(_seperator)
            myRow = myTable.NewRow
            For i = 0 To fieldValues.Length() - 1
                myRow.Item(i) = fieldValues(i).Trim.ToString
            Next
            'check if there are empty rows in csv, ignore empty rows

            If Not csv2xml.AreAllColumnsEmpty(myRow) = True Then
                myTable.Rows.Add(myRow)
            End If

        End While
    Catch ex As Exception
        'MsgBox("Error building datatable: " & ex.Message)
        Dim oError As ErrorLog = New ErrorLog
        oError.LogError(_strWebsiteName, _
            loginID, _
            ex.Source.ToString, _
            ex.Message.ToString, _
            , _
            ex.StackTrace.ToString)
        oError = Nothing
        Return New DataTable("Empty")
        'Server.Transfer(CustomErrorPage)
    Finally
        csv2xml = Nothing
        myRow = Nothing
    End Try
    myReader.Close()
    Return myTable

    End Function
4

2 に答える 2

6

VB TextFieldParserクラスを使用し、HasFieldsEnclosedInQuotesプロパティをTrueに設定するだけです。

于 2012-07-05T15:37:00.413 に答える
2

問題は、各行の文字列を区切り文字としてコンマで分割するだけで列を解析しているように見えることです。この方法は、すべてのCSVファイルで機能するわけではありません。これは、表示したように、コンマを含む文字列の場合、フィールド値全体が引用符で囲まれるためです。したがって、最初に引用符で分割し、次に残っているものをコンマで分割し、フィールドの値から引用符を削除する必要があります。これは、かなり複雑なアルゴリズムです。自分でそのようなものを作成することも、正規表現を使用して作成することもできますが、その時点では、ADOを使用してCSVファイルをロードする方がよいと思います。

Public Function LoadCsvFile(filePath As String, hasHeader As Boolean) As DataTable
    Dim folderPath As String = Path.GetDirectoryName(filePath)
    Dim fileName As String = Path.GetFileName(filePath)
    Dim hdr As String = Nothing
    If hasHeader Then
        hdr = "Yes"
    Else
        hdr = "No"
    End If
    Dim connectionString As String = String.Format("Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq={0};Extended Properties=""Text;HDR={1};FMT=Delimited""", folderPath, hdr)
    Dim connection As New OdbcConnection(connectionString)
    Dim adapter As New OdbcDataAdapter("SELECT * FROM [" + fileName + "]", connection)
    Dim table As New DataTable()
    adapter.Fill(table)
    Return table
End Function
于 2012-07-05T13:05:06.140 に答える