我正在使用带有大量数据的ruby CSV.read。库有时会遇到格式不佳的行,例如:
"Illegal quoting in line 53657."
忽略该行并跳过它会更容易,然后通过每个csv并修复格式。我怎么能这样做?
答案 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