Railsで日本語ヘッダを持つCSVファイルを読み込む
想定: ユーザにCSVをアップロードしてもらい処理を行う。その際のヘッダー名に日本語を使いたい場合の書き方
結論: i18_nを使ってマッピングします。
サンプルCSV
名前,かな
テスト,てすと
太郎,たろう
いまいちな書き方
CSV.foreach("user.csv", headers: true) { |row| puts row['名前'] }
テスト
太郎
いまいちな理由
- headerを日本語以外に変更する場合にコード修正が必要になる
- インスタンスを作成する場合のコードが冗長になる
User.new({name: row['名前'], kana: row['かな']})
2カラムぐらいなら問題ないですが、増えてくると可読性が下がります。
おすすめの書き方
config/locales/models/user.ja.yml
を作成してマッピングを行います。
マッピング用ymlファイル
ja:
activerecord:
attributes:
user:
headers:
name: 名前
kana: かな
これを使って、マッピングします。
headers = I18n.t('activemodel.attributes.user.headers')
CSV.foreach("user.csv", headers: true) { |row| puts headers.to_h {|k, v| [k, row[v]]} }
{:name=>"テスト", :kana=>"てすと"}
{:name=>"太郎", :kana=>"たろう"}
こうなります。
この状態であれば、英語を追加したい場合はen.ymlを追加すれば済みます。
またインスタンスを作成する際にもサクッとできます。
User.new({headers.to_h {|k, v| [k, row[v]]}})