日別アーカイブ: 2012 . 10 / 13

Ruby on Rails 3.2: CSVをアップロードしてActiveRecordにつっこむ

ユーザーにエクセルで出力した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に対しては配列の数がただしいかどうか、正しい位置に期待通りの値が入っているか、などの細かなチェックは必要です。