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 行的非法引用的主要内容,如果未能解决你的问题,请参考以下文章

引用指针是非法的

org.hibernate.QueryException:非法尝试取消引用集合

枚举:“非法前向引用”的一致性

SPSS13.变量名包含非法的首字符 为啥

pls-00329非法引用表结构

为啥在特殊成员函数中将 r 值绑定到 const 左值引用是非法的?