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

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

MalformedCSVError在这里是正确的。

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

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

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

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

如果您明确地调用#parse_line ,那么您可以随时调用

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

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