CSV.read x行中的非法引用

时间:2012-03-25 21:06:40

标签: ruby csv formatting

我正在使用带有大量数据的ruby CSV.read。库有时会遇到格式不佳的行,例如:

"Illegal quoting in line 53657."

忽略该行并跳过它会更容易,然后通过每个csv并修复格式。我怎么能这样做?

5 个答案:

答案 0 :(得分:70)

我在像123,456,a"b"c

这样的行中遇到了这个问题

问题是CSV解析器期望",如果它们出现,则完全包围逗号分隔的文本。

解决方案使用除"之外的引号字符,我确信它不会出现在我的数据中:

CSV.read(filename, :quote_char => "|")

答案 1 :(得分:18)

对于这种情况,可以从Ruby 2.4开始提供liberal_parsing选项。来自文档:

  

当设置为真值时,CSV将尝试解析与RFC 4180不符的输入,例如未加引号的字段中的双引号。

要启用它,请将其作为CSV读/解/新方法的选项传递:

CSV.read(filename, liberal_parsing: true)

答案 2 :(得分:4)

不要让CSV同时读取和解析文件。

只需自己阅读该文件,然后将每一行交给CSV.parse_line,然后将rescue任意例外处理。{/ p>

答案 3 :(得分:0)

尝试将双引号字符"强制设为引号字符:

require 'csv'
CSV.foreach(file,{headers: :first_row, quote_char: "\x00"}) do |line|
  p line
end

答案 4 :(得分:0)

显然,此错误也可能是由无法打印的BOM字符引起的。 This thread建议使用文件模式强制进行转换,这最终对我有用。

require 'csv'

CSV.open(@filename, 'r:bom|utf-8') do |csv|
  # do something
end