【问题标题】:String processing / CSV challenge字符串处理/CSV 挑战
【发布时间】:2013-03-26 16:15:32
【问题描述】:

使用SQL Server Bulk insert of CSV file with inconsistent quotes(CsvToOtherDelimiter 选项)作为我的基础后,我发现了 RemoveCSVQuotes 部分的一些奇怪之处[它从包含逗号的引用字符串中截断了最后一个字符!]。所以..重写了那一点(可能是一个错误?)

一个问题是客户问“这样的数据怎么样?”

""17.5179C,""

我假设如果我想继续使用 CsvToOtherDelimiter 解决方案,我必须修改 RegExp...但它超出了我的范围...最好的方法是什么?

澄清一下:在使用格式文件运行批量插入之前,我们使用 C# 将文件预处理为管道分隔格式。速度非常重要。

【问题讨论】:

    标签: c# string csv


    【解决方案1】:

    您的链接中接受的答案以:

    您将需要预处理文件,句号。

    为什么不将您的 csv 转换为 xml?然后您就可以在存储到数据库之前根据 xsd 验证您的数据。

    【讨论】:

      【解决方案2】:

      要将 CSV 字符串转换为元素列表,您可以编写一个程序来跟踪状态(引号内或引号外),因为它一次处理一个字符,并发出找到的元素。在 CSV 中引用的规则是 weird,因此您需要确保有足够的测试数据。

      状态机可以是这样的:

      1. 扫描直到引用(转到 2)或逗号(转到 3)
      2. 如果下一个字符是引号,则只在字段中添加两个引号中的一个并返回1。否则,转到4(如果引号不是字段中的第一个字符,则报告错误)。
      3. 发射场,转到 1
      4. 扫描直到报价(转到 5)
      5. 如果下一个字符是引号,则仅将两个引号中的一个添加到字段中并返回 4。否则,发出字段,扫描逗号,然后转到 1。

      这应该可以正确扫描以下内容:

      • 你好,世界,123, 456
      • “你好世界”, 123, 456
      • “他说“你好,世界!””,“我打招呼”
      • ""17.5179C,"" (正确报告错误,因为应该有一个 第一个带引号的字符串“”和第二个字段之间的分隔符 17.5179C)。

      另一种方法是找到一些做得很好的现有库。当然,CSV 足够普遍,这样的东西一定存在吗?

      编辑:

      您提到速度至关重要,所以我想指出(只要引用的字符串不允许包含换行符...)每一行都可以并行独立处理。

      【讨论】:

      • 我必须确认,但我认为客户希望数据库中的“17.5179C”最终成为“17.5179C”。
      • 由于有许多变体,这可能对您的客户有意义。我建议你得到一个明确的规范(或者至少有很多他们想要的例子)。调整我在那里提出的算法应该很容易使用“”作为引用字符串的分隔符而不是“。
      • @kpolllock 或者您可以只使用 .NET 框架 (msdn.microsoft.com/en-us/library/…) 中内置的 CSV 解析器,并在第一时间就正确处理。
      • @Tergiver 很好,我不知道那个解析器。当然,只有当它可以与您的客户想要阅读的方言完全一致时,它才有用。
      • 环顾四周,我还看到那里有一些现有代码:codeproject.com/Articles/9258/A-Fast-CSV-Reader
      【解决方案3】:

      我最终使用了我不知道我们已经拥有的 csv 解析器(作为我们代码生成工具的一部分提供) - 并注意到“17.5179C”无效并且会导致错误。

      【讨论】:

        猜你喜欢
        • 2014-09-21
        • 1970-01-01
        • 2022-07-24
        • 2012-06-29
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        相关资源
        最近更新 更多