web-dev-qa-db-ja.com

CSV.read x行目の不正な引用

私はRuby CSV.readに大量のデータを使用しています。時々、ライブラリは不適切にフォーマットされた行に遭遇します:

"Illegal quoting in line 53657."

行を無視してスキップし、各csvを調べてフォーマットを修正する方が簡単です。これどうやってするの?

38
JZ.

_123,456,a"b"c_のような行でこの問題が発生しました

問題は、CSVパーサーが_"_が出現する場合、カンマ区切りのテキストを完全に囲むことを期待していることです。

解決策は、データに表示されないと確信している_"_以外の引用文字を使用します。

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

76
Ray Baxter

liberal_parsing オプションは、Ruby 2.4以降)で利用できます。このような場合、ドキュメントから:

True値に設定すると、CSVは、引用符で囲まれていないフィールドの二重引用符など、RFC 4180に準拠していない入力を解析しようとします。

これを有効にするには、オプションとしてCSVのread/parse/newメソッドに渡します。

CSV.read(filename, liberal_parsing: true)
19
Will Madden

CSVでファイルの読み取りと解析の両方を行わないでください。

自分でファイルを読んで、各行をCSV.parse_line、次にrescueがスローするすべての例外。

5
DigitalRoss

二重引用符を強制してみてください"引用文字として:

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

どうやらこのエラーは、印刷できないBOM文字が原因である可能性もあります。 このスレッド は、ファイルモードを使用して変換を強制することを提案しています。

require 'csv'

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