15

我发现了 FasterCSV (1.5.0) 的 CSV 解析问题,这似乎是一个真正的错误,但我希望有一个解决方法。

基本上,当字段用引号引起来时,在分隔符(在我的情况下是逗号)之后添加一个空格会生成一个MalformedCSVError.

这是一个简单的例子:

# No quotes on fields -- works fine
FasterCSV.parse_line("one,two,three")
=> ["one", "two", "three"]

# Quotes around fields with no spaces after separators -- works fine
FasterCSV.parse_line("\"one\",\"two\",\"three\"")
=> ["one", "two", "three"]

# Quotes around fields but with a space after the first separator -- fails!
FasterCSV.parse_line("\"one\", \"two\",\"three\"")
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1.

我要疯了,还是 FasterCSV 中的错误?

4

3 回答 3

14

这里MalformedCSVError是正确的。

CSV 格式的前导/尾随空格不会被忽略,它们被视为字段的一部分。所以这意味着你已经用空格开始了一个字段,然后在该字段中包含了未转义的双引号,这会导致非法引用错误。

也许这个库比你用过的其他库更严格。

于 2009-11-27T10:38:46.247 回答
2

也许您可以将 :col_sep: 选项设置为 ', ' 以使其像那样解析文件。

于 2009-11-27T10:36:25.067 回答
2

我曾希望该:col_sep选项可能允许使用正则表达式,但它似乎用于阅读和写作,这是一种耻辱。该文档并没有抱太大希望,您的需求可能比通过请求更改或提交补丁来满足更直接;-)

如果你#parse_line明确地打电话,那么你总是可以打电话

gsub(/,\s*/, ',')

在你的输入线上。如果您预计带引号的字符串中可能存在逗号空格,则该正则表达式可能需要进行重大更改。(我建议在此处使用合适的标签重新发布这样的问题,并让 RegEx 专家在这种情况下放松)。

于 2009-11-27T11:50:43.997 回答