【问题标题】:Parse an advanced CSV file解析高级 CSV 文件
【发布时间】:2011-03-25 10:36:28
【问题描述】:

我必须加载以下 CSV 文件

head1, head2, head3, head4; head5
34 23; 2; "abc";"abc \"sdjh";8
34 23; 2; "abc";"abc 
sdj\;h
jshd";8
34 23; 2; "abc";"abc";8

该函数必须处理转义字符,例如 \" \; \n\r 以及字符串中的换行符。 有什么好的库可以解决这个问题吗?

【问题讨论】:

  • 看起来你可以用正则表达式以一种不太难的方式解析它,你需要如何得到结果,我的意思是,例如在第一行“34 23”是一个文本 estring 是 twho 数字“34”和“23”是一个完整的数字“3423”?
  • 第一列不重要,可以忽略。我尝试过使用正则表达式,但是当文本中有换行符时无法工作(由于某种原因,它混合在 \n 和 \r\n 之间)
  • Reading csv file的可能重复
  • 你可以正常化换行符,就像 String.replace('\n','\r\n');这样你就可以标准化所有的线刹车,然后你就可以使用正则表达式了。

标签: c# parsing c#-4.0 csv text-parsing


【解决方案1】:

我使用 .Net 的 CSV 阅读器取得了不错的成绩:http://www.codeproject.com/KB/database/CsvReader.aspx

【讨论】:

  • +1,我也取得了不错的成绩。此外,您可以使用 Excel 作为 ODBC 驱动程序来读取 csv 文件...
  • 我也尝试过 ODBC 驱动程序。它有效,但实际上更困难且更不灵活。也许对于数据绑定或查询,最好使用 ODBC。
【解决方案2】:

这不是一个有效的 CSV 文件...

标题行将被解释为

"head1"," head2"," head3"," head4; head5"

每隔一行只有一列。

我认为没有任何图书馆能够开箱即用地处理这个问题。看起来标题行有多个分隔符,所有其他行也可能有多个分隔符。如果您还提供了实际列的内容,则更容易提供帮助。

你可以试试CsvHelper(我维护的一个库)。它非常灵活。您可以更改标题和行的配置并使它们不同。您可以设置您想要的分隔符和引用字段。它还处理 \r、\n 和 \r\n 的行尾,即使每一行都使用不同的行尾。

【讨论】:

    【解决方案3】:

    我无法通过我所有的 CSV 解析测试,所以我最终写了一些简单的东西来做到这一点。 AnotherCsvParser

    它可以满足我的一切需求......但也应该很容易分叉和扩展以满足您的需求。

    给定:

     public class ABCD
     {
         public string A;
         public string B;
         public string C;
         public string D;
     }
    

    它假定列按字段定义的顺序排列..(但很容易扩展以读取属性或其他内容)

    这行得通:

        var output = NigelThorne.CSVParser.ReadCSVAs<ABCD>(
    "a,\"b\",c,d\n1,2,3,4\n\"something, with a comma\",\"something \\\"in\\\" quotes\",\" a \\\\ slash \",\n,,\"\n\",");
    

    这样:

      Assert.AreEqual(4, output.ToArray().Length);
      var row1 = output.ToArray()[0];
      Assert.AreEqual("a", row1.A);
      Assert.AreEqual("b", row1.B);
      Assert.AreEqual("c", row1.C);
      Assert.AreEqual("d", row1.D);
    

    注意:对于大量数据,它可能也不是很快。对我来说再次不是问题。

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 1970-01-01
      • 2011-05-14
      • 2016-09-16
      • 2011-04-25
      • 2016-05-04
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多