2013-05-12 65 views
4

我有一个简单的CSV文件,使用| (管道)作为引用字符。在将我的Rails应用程序从Ruby 1.9.2升级到1.9.3后,出现“CSV :: MalformedCSVError:第1行缺少或不准确的引用”错误。quote_char导致适合ruby CSV导入

如果我弹出打开vim并替换|用普通的引号,单引号甚至“=”,文件工作正常,但| |并*导致错误。任何人有什么想法可能会造成这种情况?这里有一个简单的一行,可以重现错误:

@csv = CSV.read("public/sample_file.csv", {quote_char: '|', headers: false}) 

此外,在红宝石2.0 IRB瓦特/装载轨转载此也。

编辑:这里是从CSV

|076N102     |,|CARD         |,|   1|,|NEW|,|PCS  | 
|07-1801     |,|BASE         |,|  18|,|NEW|,|PCS  | 
+1

如何从public/sample_file.csv添加几行来向我们显示数据? – hd1 2013-05-12 20:08:10

+0

@ hd1完成 - 请参阅上文! – 2013-05-12 20:43:36

+0

这不会给我一个例外。文件中是否有任何有趣的字节?如果你用'cat -v'的CSV,有没有看起来奇怪? – 2013-05-12 21:14:16

回答

6

我觉得你刚刚发现了CSV红宝石模块中的错误一些示例行。 从csv.rb:

1587: @re_chars = /#{%"[-][\\.^$?*+{}()|# \r\n\t\f\v]".encode(@encoding)}/ 

这个正则表达式中使用转义符有特殊的正则表达式的符号,包括你的“管道”字符|冲突。 我看不出有任何理由预谋[-],所以如果你删除它,你的榜样开始工作:

编辑:连字号有字符集的表达(用方括号包围[])内进行转义只当不是主角时。因此,必须更新固定的正则表达式:

1587: @re_chars = /#{%"(?<!\\[)-(?=.*\\])|[\\.^$?*+{}()|# \r\n\t\f\v]".encode(@encoding)}/ 

CSV.read('sample.csv', {quote_char: '|'}) 
# [["076N102     ", 
# "CARD         ", 
# "   1", "NEW", "PCS  "], 
# ["07-1801     ", 
# "BASE         ", 
# "  18", "NEW", "PCS  "]] 

由于大多数语言不支持与量词回顾后表情,包括红宝石,我不得不把它写为左括号负版本。它也会将连字符与缺少的左括号中的一个匹配。如果你找到更好的解决方案,请发表评论。

很高兴在填写bugy-lang.org的错误报告之前听到任何意见。

+0

Ruby 2.0.0p195刚刚发布,它不能解决这个问题,所以提交一个错误和提交补丁将非常感激,如果你为它。 – 2013-05-14 21:30:41

+1

有人已经填写了错误报告 - https://bugs.ruby-lang.org/issues/8405 – Torimus 2013-05-15 03:22:53