LoginSignup
0
0

More than 3 years have passed since last update.

RailsでCSVインポートする時、nkfコマンドを使ったらめっちゃ楽だった

Last updated at Posted at 2020-10-12

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コマンドが使えないので気をつけてください。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0