如果逗号(,)在引号中,那么在CSV文件中忽略逗号(,)的最佳方法是什么?

如果逗号(,)在引号中,那么在CSV文件中忽略逗号(,)的最佳方法是什么?,csv,datatable,Csv,Datatable,我有一个读取CSV文件的小程序,用它来构建数据表。一个要求是,如果逗号位于引号之间,则忽略逗号(名称中的逗号等)。例如 Name, Age, Location "Henderson, David", 32, London John Smith, 19, Belfast 程序应忽略Henderson后面的逗号,并将Henderson、David作为一个字段。我当前的代码无法在末尾添加额外的列。那么,我如何才能做到这一点呢?解决方案不应

我有一个读取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
公共函数BuildDataTable()作为DataTable
将myTable设置为DataTable=新DataTable(“myTable”)
作为整数的Dim i
将myRow设置为DataRow
将字段值设置为字符串()
Dim myReader As StreamReader=新的StreamReader(_fileFullPath,Encoding.GetEncoding(“iso-8859-1”))
尝试
fieldValues=myReader.ReadLine().Split(_分隔符)
'相应地创建数据列
如果_hasheader=False,则
对于i=0到fieldValues.Length()-1
添加(新数据列(“列(&i&”))
下一个
其他的
'如果文件有标头,则将第一行作为datatable的标头
对于i=0到fieldValues.Length()-1
myTable.Columns.Add(新数据列(字段值(i).Replace(“,”))
下一个
如果结束
myRow=myTable.NewRow
如果_hasheader=False,则
对于i=0到fieldValues.Length()-1
myRow.Item(i)=字段值(i).ToString
下一个
myTable.Rows.Add(myRow)
如果结束
而myReader.Peek()-1
fieldValues=myReader.ReadLine().Split(_分隔符)
myRow=myTable.NewRow
对于i=0到fieldValues.Length()-1
myRow.Item(i)=字段值(i).Trim.ToString
下一个
如果不是csv2xml.AreAllColumnsEmpty(myRow)=True,则
myTable.Rows.Add(myRow)
如果结束
结束时
特例
结束尝试
端函数

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

fieldValues = myReader.ReadLine().Split(_seperator)    ' DO NOT do this
相反,编写您自己的拆分函数,它逐个读取每个字符。然后有一个标志来记录您是否在双引号之间


更新

很抱歉,我对VB或C知之甚少,无法编写可运行的代码sniplet。 请阅读此伪代码(事实上它是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"]
带引号的函数拆分(字符串、分隔符、引号){
如果(分隔符==null)分隔符=',';
如果(QUOTE==null)QUOTE=''”;
报价单中的var=假;
var结果=[];
var部分=“”;
对于(变量i=0;i
您希望在CSV中使用双引号字符作为文本限定符。如果字段包含在文本限定符字符中,则文本限定符允许您在字段值中使用字段分隔符字符

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

您仍然需要编写将CSV内容写入数据表的代码

我发现以下方法似乎有效:

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

该解析器的优点在于,它包含了一种方法,您可以使用该方法从CSV返回数据表。下面是一个使用示例数据的示例:

Using parser As New GenericParsing.GenericParserAdapter(CSV_FILE_FULLNAME)
    parser.ColumnDelimiter = ","
    parser.TextQualifier = """"
    parser.FirstRowHasHeader = True
    Dim dt As DataTable = parser.GetDataTable()
End Using

谢谢你的回答,Charlee,我知道我必须改变这一行。我知道我必须编写自己的函数来完成这项工作,这是一个谜。你能再解释一下吗?即使是在C#中,如果你用的是这个。