Excelスプレッドシートから生成されたCSVファイルを解析しようとしています。
ここに私のコードがあります
_require 'csv'
file = File.open("input_file")
csv = CSV.parse(file)
_
しかし、私はこのエラーを受け取ります
_ArgumentError: invalid byte sequence in UTF-8
_
エラーは、Excelがファイルを_UTF-8
_ではなくISO 8859-1 (Latin-1)
にエンコードするためだと思います
誰かがこの問題の回避策を手伝ってくれますか?
前もって感謝します。
ファイルがISO-8859-1にあることをRubyと伝える必要があります。ファイルを開く行を次のように変更します。
file=File.open("input_file", "r:ISO-8859-1")
2番目の引数はRuby ISO-8859-1のエンコーディングで読み取り専用で開くように指示します。
encoding
オプションでエンコードを指定します。
CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
...
end
ファイルモードパラメータでソースエンコーディングを直接指定できます。
CSV.foreach( "file.csv", "r:windows-1250" ) do |row|
<your code>
end
何らかの理由で別の方法で保存する必要がない限り、utf-8でファイルを保存します。その場合、ファイルの読み取り中にエンコードセットを指定できます。
2番目の引数_"r:ISO-8859-1"
_をFile.open("input_file","r:ISO-8859-1" )
として追加します
これと同じ問題があり、Googleスプレッドシートを使用してからCSVとしてダウンロードしていました。それが最も簡単な解決策でした。
それからこの宝石に出会いました
https://github.com/singlebrook/utf8-cleaner
今、私はこの問題についてまったく心配する必要はありません。お役に立てれば!
ファイルが1つ(または少数)の場合、入力から取得したファイルのエンコーディングを自動的に宣言する必要がなく、このファイルの内容がセミコロンで区切られたプレーンテキスト(txt、csvなど)で表示されている場合、 .csv
拡張子を持つ新しいファイルを手動で作成し、そこにファイルの内容を貼り付けてから、通常のように内容を解析できます。
これは回避策ですが、Linuxで解析する必要があるのは1つの大きなExcelファイルのみであり、csvのフレーバーに変換されるため、これらすべてのファンシーエンコーディングの実験に時間を割く必要があります。