3

我在解析 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|

我如何通过这个?

4

2 回答 2

4

该消息在技术上是正确的。引号对于 CSV 格式具有特殊含义 - 它们允许您在数据中嵌入分隔符。因此,如果字段中使用的任何引号是数据的一部分,则需要对其进行转义,或者应通知 CSV 解析器使用其他字符进行引用,在这种情况下,它将把"它看到的任何字符视为文字数据。

如果您不需要在每个字段中实际支持管道,并且有一些其他未使用的字符,您可以将此问题转移到,Ruby 的 CSV 可以使用您的(稍微)格式错误的 csv 格式:

CSV.parse(data, {:col_sep => '|', :quote_char => "%" })

否则,您的问题行的正确引用是

|"Some ""quoted name"""|2|12|Machine|
于 2013-05-23T11:27:40.337 回答
1

错误的原因是,该行是格式错误的 CSV。看看这里,它说:

每个嵌入的双引号字符必须由一对双引号字符表示。

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]
于 2013-05-23T11:36:45.733 回答