私はRuby CSV.readに大量のデータを使用しています。時々、ライブラリは不適切にフォーマットされた行に遭遇します:
"Illegal quoting in line 53657."
行を無視してスキップし、各csvを調べてフォーマットを修正する方が簡単です。これどうやってするの?
_123,456,a"b"c
_のような行でこの問題が発生しました
問題は、CSVパーサーが_"
_が出現する場合、カンマ区切りのテキストを完全に囲むことを期待していることです。
解決策は、データに表示されないと確信している_"
_以外の引用文字を使用します。
CSV.read(filename, :quote_char => "|")
liberal_parsing
オプションは、Ruby 2.4以降)で利用できます。このような場合、ドキュメントから:
True値に設定すると、CSVは、引用符で囲まれていないフィールドの二重引用符など、RFC 4180に準拠していない入力を解析しようとします。
これを有効にするには、オプションとしてCSVのread/parse/newメソッドに渡します。
CSV.read(filename, liberal_parsing: true)
CSVでファイルの読み取りと解析の両方を行わないでください。
自分でファイルを読んで、各行をCSV.parse_line
、次にrescue
がスローするすべての例外。
二重引用符を強制してみてください"
引用文字として:
require 'csv'
CSV.foreach(file,{headers: :first_row, quote_char: "\x00"}) do |line|
p line
end
どうやらこのエラーは、印刷できないBOM文字が原因である可能性もあります。 このスレッド は、ファイルモードを使用して変換を強制することを提案しています。
require 'csv'
CSV.open(@filename, 'r:bom|utf-8') do |csv|
# do something
end