字符串处理/ CSV挑战

时间:2013-03-26 16:15:33

标签: c# string csv

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

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

""17.5179C,""

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

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

3 个答案:

答案 0 :(得分:0)

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

状态机可以这样:

  1. 扫描直到引用(转到2)或逗号(转到3)
  2. 如果下一个字符是引号,则只将两个引号中的一个添加到字段并返回1.否则,转到4(如果引号不是字段中的第一个字符,则报告错误)。
  3. 发出字段,转到1
  4. 扫描直到引用(转到5)
  5. 如果下一个字符是引号,则只将两个引号中的一个添加到字段中并返回4.否则,发出字段,扫描逗号,然后转到1.
  6. 这应该正确扫描像:

    这样的东西
    • 你好,世界,123,456
    • “hello world”,123,456
    • “他说”“你好,世界!”“”,“我说嗨”
    • “”17.5179C,“”(正确报告错误,因为应该有一个 第一个引用字符串“”和第二个字段之间的分隔符 17.5179C)。

    另一种方法是找到一些能够做得很好的现有库。当然,CSV很常见,必须存在这样的东西?

    编辑:

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

答案 1 :(得分:0)

您的链接中接受的答案始于:

  

您需要预处理文件,期间。

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

答案 2 :(得分:0)

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