在.NET中解析带有未转义的引号和逗号的CSV文件

时间:2009-04-22 09:46:00

标签: .net string parsing csv

我想知道是否有人可以帮助我。

我必须解析csv文件中的数据并将其放入db表中。数据的一个例子如下:

“first field”,“second field”,“third Field ”,“第四场”

正如您所看到的,字段中嵌入了引号和逗号。我使用的是ADO.NET,但它存在嵌入式引号的问题。嵌入的引号后面的任何字段都为null

e.g。从上面的例子中可以将以下内容插入到DB表中。

first field  |  second, field   |  third     | NULL

这是我正在使用的代码。

    Dim dataTable As New DataTable
    Dim dataAdapter As New OleDbDataAdapter

    Dim cmd As New OleDbCommand
    Dim path As String = "c:\"


        Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
           & System.IO.Path.GetDirectoryName(filename) & ";Extended Properties=""Text;HDR=Yes;FMT=Delimited""")

        cmd.CommandText = "Select * FROM " & System.IO.Path.GetFileName(filename)
        dataAdapter.SelectCommand = cmd
        cmd.Connection = conn
        conn.Open()
        dataAdapter.Fill(dataTable)

然后我将数据插入到db表中。

对此有任何建议或指导将不胜感激。

5 个答案:

答案 0 :(得分:1)

到目前为止,还没有真正理解答案。

据我所知,如果不添加额外的限制,就无法解析您的示例输入字符串。

这是你提出问题的第三个领域。解析器如何判断“在第三个和Field之间我们还没有完成第三个元素?通过检测后面的字符不是逗号?如果第三个字段还包含一个逗号,那该怎么办?

"first field", "second , field", "third ", Field " ", "fourth field"

此时,您正在进行多次通过试验和错误解析(虽然我不是专家)。也就是说,解析器必须到达F字段,并意识到这是不可解析的,备份并包含“,在第三个字段中并继续执行以下操作”......等等

[即使是Excel也无法应对该字符串。]

答案 1 :(得分:0)

这可能是一个挑战 - 但编写代码来手动解析一行csv数据是相当简单的。

基本上你有两种可能的情况:

  1. 保证每个字段都用双引号分隔
  2. 任何包含逗号的字符串都会被双引号括起来 - 如果你在引号字符串中有逗号,那么事情可能会变得有趣,所以你可能必须设置限制你想要的聪明程度(所提供的内容)数据可以包含)。
  3. 对于第一种情况,基本上所有你需要做的就是在“,”组合上拆分字符串(这可能必须手动完成) - 记住从第一列/项中删除前导“从第一列/项和尾随”最后一栏/项目 - 你几乎就在那里。

    对于第二种情况,你必须做更多的工作 - 或者a)在每个逗号上分割线,然后处理结果拼接相邻的项目,其中一个项目以双引号开头但不以一个结束(你连接字段 - 不要忘记包含逗号 - 直到找到以“但不以一个开头”结尾的相应项目,或者b)在每次迭代时循环遍历字符串,从列表中提取第一个项目(如果它以“那么你正在寻找”开始,结束它,否则你只是自己寻找一个逗号并允许在两个实例中找不到分隔符的边界情况,因为你正在查看最后一栏。

    希望这会有所帮助。一点。

答案 2 :(得分:0)

您可以尝试区分引用区域和不检查以下正则表达式可以匹配前一个或后一个字符的字段@“\ p {Z} ,\ p {Z} ” 使用相同的概念,除了通过附近引号的存在来区分逗号外,您可以在文本中使用逗号。 运行这些启发式和逃避逗号和引号不符合上述规则应该产生一个非常干净的结果 当然有可能出现这种情况不正常的情况,但据我所知,如果CSV没有转义,就没有更好的办法来解决这个问题。

答案 3 :(得分:0)

如果您的代码不需要成为应用程序的一部分,但您只想生成SQL语句以从CSV数据更新数据库,那么您可能对我自己的CSVFix项目感兴趣,这就是FOSS &安培;允许您以多种方式操作CSV数据而无需编程。

答案 4 :(得分:0)

冷却。谢谢你们的帮助。我正在处理的文件非常大,因此手动解析效率不高。

我通过获取带有转义引号的正确csv文件并在未发生这种情况时添加验证和错误处理来解决了这个问题。