【发布时间】:2012-04-09 11:32:14
【问题描述】:
我正在使用 ruby CSV.read 处理大量数据。库有时会遇到格式不正确的行,例如:
"Illegal quoting in line 53657."
忽略该行并跳过它会更容易,然后遍历每个 csv 并修复格式。我该怎么做?
【问题讨论】:
标签: ruby csv formatting
我正在使用 ruby CSV.read 处理大量数据。库有时会遇到格式不正确的行,例如:
"Illegal quoting in line 53657."
忽略该行并跳过它会更容易,然后遍历每个 csv 并修复格式。我该怎么做?
【问题讨论】:
标签: ruby csv formatting
显然这个错误也可能是由不可打印的 BOM 字符引起的。 This thread 建议使用文件模式来强制转换,这最终对我有用。
require 'csv'
CSV.open(@filename, 'r:bom|utf-8') do |csv|
# do something
end
【讨论】:
尝试将双引号字符 " 强制为引号字符:
require 'csv'
CSV.foreach(file,{headers: :first_row, quote_char: "\x00"}) do |line|
p line
end
【讨论】:
liberal_parsing 选项从 Ruby 2.4 开始可用于此类情况。来自文档:
当设置为真值时,CSV 将尝试解析不符合 RFC 4180 的输入,例如未加引号的字段中的双引号。
要启用它,请将其作为选项传递给 CSV 读取/解析/新方法:
CSV.read(filename, liberal_parsing: true)
【讨论】:
我在123,456,a"b"c 这样的一行中遇到了这个问题
问题是 CSV 解析器期望 "(如果出现)完全包围逗号分隔的文本。
解决方案使用除 " 之外的引号字符,我确信它不会出现在我的数据中:
CSV.read(filename, :quote_char => "|")
【讨论】:
quote_char: "\x00" 这样的不可打印字符。
""(可能来自我的文本编辑器添加了 "。根据 Ruby 文档,CSV will always consider a double sequence of this character to be an escaped quote. This String will be transcoded into the data’s Encoding before parsing. ruby-doc.org/stdlib-2.3.0/libdoc/csv/rdoc/CSV.html
不要让 CSV 同时读取和解析文件。
只需自己阅读文件并将每一行交给CSV.parse_line,然后将其抛出的任何异常交给rescue。
【讨论】: