我在解析我的CSV文件时遇到了问题,我暂时无法解决这个问题。我的管道分离CSV文件有一个特殊情况,无法解析。这是我的代码:
CSV.parse(data, {:headers => true, :header_converters => [:symbol, :downcase], :col_sep => '|'}).each do |row|
if row[:name]
counter += 1
end
这是产生Message: Illegal quoting in line 2
:
|test "Some quoted name"|2|12|Machine|
但是这个工作和其他案例有效:
|"Some quoted name"|2|12|Machine|
我如何通过这个?
答案 0 :(得分:4)
该消息在技术上是正确的。报价对CSV格式具有特殊含义 - 它们允许您在数据中嵌入分隔符。因此,如果字段中使用的任何引号都是数据的一部分,则需要对其进行转义,或者应通知CSV解析器使用其他字符进行引用,在这种情况下,它会将其视为的任何"
视为文字数据。
如果你不需要在每个字段中实际支持管道,并且有一些其他未使用的字符,你可以将这个问题转移到,Ruby的CSV可以使用你的(稍微)格式错误的csv格式:
CSV.parse(data, {:col_sep => '|', :quote_char => "%" })
否则,问题行的正确引用是
|"Some ""quoted name"""|2|12|Machine|
答案 1 :(得分:1)
错误的原因是,行是格式错误的CSV。看看here,它说:
每个嵌入的双引号字符必须用一对双引号字符表示。
1997,Ford,E350,"Super, ""luxurious"" truck"
考虑到这一点,以下工作:
CSV.parse('|test "Some quoted name"|2|12|Machine|', {:col_sep => '|', :quote_char => "'"}).each do |row|
pp row
end
# => [nil, "test \"Some quoted name\"", "2", "12", "Machine", nil]