RailsでCSVファイルをインポートするとき、こんな感じに実装してた。
def read_csv
begin
rows = CSV.read(file, encoding: 'UTF-8')
rescue CSV::MalformedCSVError
begin
# csvファイルがUTF-8でない場合はShift_JISで読む
rows = CSV.read(file, encoding: 'Shift_JIS')
rescue CSV::MalformedCSVError, Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError
# csvファイルがUTF-8・Shift_JISでもない場合
@error = 'ファイルのエンコードはUTF-8かShift_JISではありません。'
end
end
rows&.shift # ヘッダーを削除する
rows
end
問題点
例外処理が多くて面倒だし、そもそもインポートできる文字コード2つしかないとか…
解決策
どうやらnkf
とかいうモジュールを使うとなんでも変換できそうだ…
https://docs.ruby-lang.org/ja/latest/class/NKF.html
- nkfをPCにインストール
brew install nkf
nkf -w --overwrite 変換したいファイルのpath
このコマンドを使えばいい感じに変換できそう。
- Railsの中にこのコマンドを組み込んでみる。
def read_csv(file)
system("nkf -w --overwrite #{file.path}")
rows = CSV.read(file)
rows&.shift # 1行目のヘッダーを削除する
rows
end
すっきりとしたコードになりました。
注意点
あらかじめbrew install nkf
コマンド等でnkfをインストールしておかないと、nkf
コマンドが使えないので気をつけてください。