2010年10月6日水曜日

csvを読み込む(2)

このblogは自分用メモ、というのが大きな役目で、かつあんまり人目もないので(^^;)気軽にcodeを残しておく、と。

csvファイルを読み込んでデータベースに保存するのは、ここに一通りコードが載っている。これを参考に自分でやってみた、と。ただ、

  1. csvファイルをサイトにuploadする
  2. それが成功したら、

map.resources :imports
map.import_proc '/import/proc/:id', :controller => "imports", :action => "proc_csv"

というリダイレクトでcsvファイルを読み込むaction「proc_csv」を実行して、そこからshowにリダイレクトする、という手順が若干面倒。

ま、rails3のroutes.rbの書き方が全然わかってない、という事情もあって、imports_controllerは次のように書いた。


class ImportsController < ApplicationController
def new
@import = Import.new

end

def create
@import = Import.new(params[:import])
respond_to do |format|
if @import.save!
flash[:notice] = 'CSV data was successfully imported.'
proc_csv
else
flash[:error] = 'CSV data import failed.'
format.html { render :action => "new" }
end
end
end

def show
@import = Import.find(params[:id])

end

def index
end


def proc_csv
lines = parse_csv_file(@import.csv.path)

if lines.size > 0
@import.processed = lines.size
lines.each do |line|
new_event(line)
end
@import.save
flash[:notice] = "CSV data processing was successful."
redirect_to :action => "show", :id => @import.id
else
flash[:error] = "CSV data processing failed."
render :action => "show", :id => @import.id
end
end

private

def parse_csv_file(path_to_csv)
lines = []
require 'csv'

CSV.foreach(path_to_csv) do |row|
lines << row
end
lines
end

def new_event(line)
require 'date'
if line[4]
day = Date::new(line[0].to_i, line[1].to_i, line[2].to_i)
event=Event.new
event.start_at=day
event.name=line[4]
event.save
end
end
end


これで、

こんなcsvファイルを

こんな形でdbに保存できる、と。これが昨日一日の勉強ですな。

0 件のコメント:

コメントを投稿