使用FasterCSV gem解决CSV解析的基本问题

时间:2009-11-27 10:27:47

标签: ruby fastercsv

我发现了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中的错误?

3 个答案:

答案 0 :(得分:14)

MalformedCSVError在这里是正确的。

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

如果您明确调用#parse_line,则可以随时调用

gsub(/,\s*/, ',')
输入行上的

。如果您预期引用字符串中可能存在逗号空间,那么正则表达式可能需要显着改变。 (我建议在这里使用合适的标签重新发布这样的问题,并且如果是这样的话,让RegEx mavens松散吧。)