2010年07月22日

Ruby on Rails 行と列を意識したCSV出力

行と列を意識したCSV出力とは?


通常のcsv出力は1カラムが1行として出力するのが普通ですが、
例えば、クイズが1〜3の3種類あったとしてそれを
一つずつ列にして、なおかつ行に日付にします。
つまり
期間 クイズ1 クイズ2 クイズ3
5/1 title title title
5/2 title title title
5/3 title title title

このような形のcsv出力をしたいという訳です。
テーブルのカラムは
id,quiz,type,created_at

といったところです。
日付でGROUP BYなどして出力しても
期間 クイズ種類 title
5/1 クイズ1 title
5/2 クイズ2 title
5/3 クイズ3 title

このようにクイズの種類ごとに並べることはできません。

環境


rails1.2.6
table1
app/controllers/csv_controller.rb

使用方法


結構なごり押しな感じな書き方ではありますが、
2重配列を作成して吐き出す方法をとりました。
$ vi csv_controller.rb
class CsvController < ApplicationController
 def csv
  require 'csv'
  @csv = []
  start_date = Date.parse(params[:start])
  end_date = Date.parse(params[:start])
  date = end_date - start_date
  // 日付の開始と終わりのデータを取ってきています(このviewは省略)
  p_date = date.to_i + 1
  i = 0
  p_date.times do
   end_date = start_date + i
   type1 = Table1.type_titel(1, end_date)
   type2 = Table1.type_titel(2, end_date)
   type3 = Table1.type_titel(3, end_date)
   // 日付とクイズの種類を指定してデータを取り出す処理(省略)
   @csv << [end_date, type1.title, type2.title, type3.title]
   i += 1   
  end
  // これで@csvに2重配列となり、日付とそれぞれのクイズのタイトルが入ります。
  
  headers["Content-Type"] ||= "text/csv"
  headers[""Content-Disposition] ||= "attachment; filename=\hoge\"
  csv_string = FasterCSV.generate do |csv|
   csv << ["期間", "クイズ1", "クイズ2", "クイズ3"]
   // 列の名前
   @csv.each do |a_csv|
    csv << a_csv
    // ここで行を入れる
   end
  end
  render :text => csv_string.tosjis
 end
end
posted by RicK at 16:05| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/39760434

この記事へのトラックバック