CSV.read 第 x 行的非法引用
Posted
技术标签:
【中文标题】CSV.read 第 x 行的非法引用【英文标题】:CSV.read Illegal quoting in line x 【发布时间】:2012-04-09 11:32:14 【问题描述】:我正在使用 ruby CSV.read 处理大量数据。库有时会遇到格式不正确的行,例如:
"Illegal quoting in line 53657."
忽略该行并跳过它会更容易,然后遍历每个 csv 并修复格式。我该怎么做?
【问题讨论】:
【参考方案1】:显然这个错误也可能是由不可打印的 BOM 字符引起的。 This thread 建议使用文件模式来强制转换,这最终对我有用。
require 'csv'
CSV.open(@filename, 'r:bom|utf-8') do |csv|
# do something
end
【讨论】:
【参考方案2】:尝试将双引号字符 "
强制为引号字符:
require 'csv'
CSV.foreach(file,headers: :first_row, quote_char: "\x00") do |line|
p line
end
【讨论】:
【参考方案3】:liberal_parsing
选项从 Ruby 2.4 开始可用于此类情况。来自文档:
当设置为真值时,CSV 将尝试解析不符合 RFC 4180 的输入,例如未加引号的字段中的双引号。
要启用它,请将其作为选项传递给 CSV 读取/解析/新方法:
CSV.read(filename, liberal_parsing: true)
【讨论】:
【参考方案4】:我在123,456,a"b"c
这样的一行中遇到了这个问题
问题是 CSV 解析器期望 "
(如果出现)完全包围逗号分隔的文本。
解决方案使用除 "
之外的引号字符,我确信它不会出现在我的数据中:
CSV.read(filename, :quote_char => "|")
【讨论】:
在请求者的情况下,他特别有大量数据,只想跳过错误。更改 :quote_char 只是帮助我解决了我的情况。 这也适用于我的情况,它运行了 100+ 千行 csv 数据而没有错误 2015 年的精彩还在继续 :) 谢谢.. 我确实花了几个小时才到达这里 :) 对于我的数据,我不确定哪些字符不会出现,但它显然适用于像quote_char: "\x00"
这样的不可打印字符。
如果您像我一样因为 Google 搜索而来到这里尝试修复此错误。我的问题是我的 csv 文件中有一个 ""
(可能来自我的文本编辑器添加了 "
。根据 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【参考方案5】:
不要让 CSV 同时读取和解析文件。
只需自己阅读文件并将每一行交给CSV.parse_line
,然后将其抛出的任何异常交给rescue
。
【讨论】:
以上是关于CSV.read 第 x 行的非法引用的主要内容,如果未能解决你的问题,请参考以下文章