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

Ruby on Rails 3.2: CSVをアップロードしてActiveRecordにつっこむ」への2件のフィードバック

  1. j

    参考にさせて頂きました。ありがとうございました。
    一点だけ。

    CSV.parsed の行で undefined method のエラーになりました。
    CSV.parse の間違いかと思います。

  2. dyo 投稿作成者

    ご指摘ありがとうございます。
    早速修正いたしました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です