web-dev-qa-db-ja.com

Ruby / Rails CSV解析、UTF-8の無効なバイトシーケンス

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)にエンコードするためだと思います

誰かがこの問題の回避策を手伝ってくれますか?

前もって感謝します。

41
rogeliog

ファイルがISO-8859-1にあることをRubyと伝える必要があります。ファイルを開く行を次のように変更します。

file=File.open("input_file", "r:ISO-8859-1")

2番目の引数はRuby ISO-8859-1のエンコーディングで読み取り専用で開くように指示します。

66
Linuxios

encodingオプションでエンコードを指定します。

CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
  ...
end
16

ファイルモードパラメータでソースエンコーディングを直接指定できます。

CSV.foreach( "file.csv", "r:windows-1250" ) do |row|
   <your code>
end
12
kixorz

何らかの理由で別の方法で保存する必要がない限り、utf-8でファイルを保存します。その場合、ファイルの読み取り中にエンコードセットを指定できます。

0
Eliza A

2番目の引数_"r:ISO-8859-1"_をFile.open("input_file","r:ISO-8859-1" )として追加します

0
Gagan Gami

これと同じ問題があり、Googleスプレッドシートを使用してからCSVとしてダウンロードしていました。それが最も簡単な解決策でした。

それからこの宝石に出会いました

https://github.com/singlebrook/utf8-cleaner

今、私はこの問題についてまったく心配する必要はありません。お役に立てれば!

0
user3787971

ファイルが1つ(または少数)の場合、入力から取得したファイルのエンコーディングを自動的に宣言する必要がなく、このファイルの内容がセミコロンで区切られたプレーンテキスト(txt、csvなど)で表示されている場合、 .csv拡張子を持つ新しいファイルを手動で作成し、そこにファイルの内容を貼り付けてから、通常のように内容を解析できます。

これは回避策ですが、Linuxで解析する必要があるのは1つの大きなExcelファイルのみであり、csvのフレーバーに変換されるため、これらすべてのファンシーエンコーディングの実験に時間を割く必要があります。

0
ToTenMilan