1

我有一个小程序来读取 CSV 文件以从中构建数据表。如果逗号在引号之间,则一项要求是忽略逗号(名称中的逗号等)。例子。

          Name, Age, Location
          "Henderson, David", 32, London
           John Smith, 19, Belfast

该程序应忽略 Henderson 之后的逗号,并将 Henderson, David 视为一个字段。我当前的代码无法在最后添加额外的列来完成这项工作。那么我该如何实现呢?解决方案不应替换引号之间的逗号。谢谢。

我当前的代码。

 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 StreamReader = New StreamReader(_fileFullPath, Encoding.GetEncoding("iso-8859-1"))

    Try           
        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

        myRow = myTable.NewRow

        If _hasheader = False Then
            For i = 0 To fieldValues.Length() - 1
                myRow.Item(i) = fieldValues(i).ToString
            Next
            myTable.Rows.Add(myRow)
        End If

        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

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

        End While
    Catch ex As Exception                   
    End Try     
End Function
4

2 回答 2

3

您希望在 CSV 中使用双引号字符作为文本限定符。如果字段包含在文本限定符字符中,则文本限定符允许您在字段值中使用字段分隔符。

你可以自己编程,但那将是一个错误。有许多免费且功能强大的 CSV 解析器可以为您执行此操作。由于您使用的是 Visual Basic,因此您可以查看TextFieldParser该类

您仍然需要编写将 CSV 的内容写入 DataTable 的代码。

我发现以下似乎可行:
http ://www.vbcode.com/asp/showsn.asp?theID=13645

另一种选择是GenericParsercodeproject.com 上。不要让文章中的代码是用 C# 编写的事实困扰您;您仍然可以在项目中引用 DLL (GenericParsing.dll) 并在 VB 中使用它。

这个解析器的好处是它包含一个方法,您可以使用它从 CSV 为您返回一个 DataTable。这是一个适用于您的示例数据的示例:

Using parser As New GenericParsing.GenericParserAdapter(CSV_FILE_FULLNAME)
    parser.ColumnDelimiter = ","
    parser.TextQualifier = """"
    parser.FirstRowHasHeader = True
    Dim dt As DataTable = parser.GetDataTable()
End Using
于 2012-10-01T20:06:31.390 回答
0

我不熟悉 Visual Basic,但我认为您不应该使用Split()函数来拆分行。

fieldValues = myReader.ReadLine().Split(_seperator)    ' DO NOT do this

相反,编写您自己的拆分函数,它会一个一个地读取每个字符。然后有一个标志来记录你是否在双引号之间。


更新

很抱歉,我对 VB 或 C# 知之甚少,无法编写可运行的代码片段。请阅读此伪代码(实际上它是 JavaScript)...希望它有用。

function split_with_quote(string, delimiter, quotation) {
    if (delimiter == null) delimiter = ',';
    if (quotation == null) quotation = '"';
    var in_quotation = false;
    var result = [];
    var part = '';
    for (var i = 0; i < string.length; i++) {
        var ch = string[i];
        if (ch == quotation)  in_quotation = !in_quotation;
        if (ch == delimiter && !in_quotation) {
            result.push(part);
            part = '';
        } else {
            if (ch != quotation) part += ch;
        }
    }
    return result;
}

a = 'abc,def,"ghi,jkl",123';
split_with_quote(a);    // ["abc", "def", "ghi,jkl"]
于 2012-10-01T15:48:48.973 回答