Techioz Blog

ActiveStorage CSV ファイルは強制的にエンコードされますか?

概要

アップロードしている CSV ファイルがありますが、データベースに行をインポートするときに問題が発生します。

Encoding::UnknownConversionError (ASCII-8BIT から UTF-8 への「�」)

各列がデータベースに配置されるように適切にエンコードされるか無視されるかを確認する最も効率的な方法は何でしょうか?

最も基本的なアプローチは、各行と各フィールドを調べて文字列を強制的にエンコードすることですが、これは非常に非効率的です。これに対処するより良い方法は何でしょうか?

現在はパラメータ (:csv_file) としてアップロードされるだけです。次に、次のようにアクセスします。

モデル内の CSV.parse(csv_file.download)。

CSV.parseがactivestorageファイルで呼び出されたときにエンコードを強制する方法があると思いますが、その方法はわかりません。何か案は?

ありがとう!

解決策

最新バージョンの ActiveStorage (6.0.0.rc1) では、ファイルを一時ファイルにダウンロードして、そこから読み取ることができる API が追加されています。 Ruby は正しいエンコーディングを使用してファイルを読み取ると想定しています。

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://edgeguides.rubyonrails.org/active_storage_overview.html#downloading-files

Rails 6 の RC にアップグレードしたくない場合は (私もそうではありませんが)、このメソッドを使用して、ファイル内に存在する可能性のあるバイト オーダー マークを削除しながら文字列を UTF-8 に変換できます。

wrongly_encoded_string = active_record_model.attachment.download
correctly_encoded_string = wrongly_encoded_string.bytes.pack("c*").force_encoding("UTF-8")