0

使用SQL Server 批量插入带有不一致引号的 CSV 文件(CsvToOtherDelimiter 选项)作为我的基础后,我发现了 RemoveCSVQuotes 部分的一些奇怪之处[它从包含逗号的引用字符串中截断了最后一个字符!]。所以..重写了那一点(也许是一个错误?)

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

""17.5179C,""

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

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

4

3 回答 3

0

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

于 2013-03-27T15:15:29.497 回答
0

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

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

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

于 2013-03-26T16:25:56.593 回答
0

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

状态机可以是这样的:

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

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

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

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

编辑:

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

于 2013-03-26T16:22:38.613 回答