ユーザーにエクセルで出力したCSVをあげさせて、ActiveRecord経由でDBにデータを格納したいという用途は結構ある気がしますが、なかなか情報がないのでやってみた記録をします。
アップロードしたCSVをDBのデータとして使用するのには3つのハードルがあります。
- CSVをどのようにしてパースするか
- パースしたCSVからどのようにデータを格納するか
- エンコーディングの問題
まずCSVをパースするのにはCSVのライブラリを用います。
require ‘csv’
source = params[:csv].read
parsed = CSV.parse(source)
とします。これでparsedに配列(行)の配列(列)がはいれます。
これをループして必要なデータを取り出しますが、
parsed.each do | row |
#row
end
データを取り出したらあとは普通に文字列として扱えますのでActiveRecordを介してDBに格納すればOKです。
しかし、文字コードの問題が残っています。
一番最初のCSVをアップロードした時点でKconvというライブラリを用いてエンコーディングすることで対応しました。
require ‘csv’
require ‘kconv’
source = params[:csv].read
source = Kconv.toutf8(source)
parsed = CSV.parse(source)
また、parsedに対しては配列の数がただしいかどうか、正しい位置に期待通りの値が入っているか、などの細かなチェックは必要です。
参考にさせて頂きました。ありがとうございました。
一点だけ。
CSV.parsed の行で undefined method のエラーになりました。
CSV.parse の間違いかと思います。
ご指摘ありがとうございます。
早速修正いたしました!