0

Railsの組み込みのcsvライブラリを使用して、Railsアプリケーションからデータセットをcsvファイルとしてエクスポートするのが好きです。通常、csvファイルは、以下の例のように行ごとに書き込まれます。これは、datasets_controller.rbから取得されます。

require 'csv'

dataset = Dataset.find(6)
dataset_headers = dataset.datacolumns.collect { |dc| dc.columnheader }

csv_file = CSV.generate do  |csv|                                                                                                           
   csv << dataset_headers
end

そして今、私の質問は、私のcsvファイルをこのように列ごとに書くことができるかどうかです。

require 'csv'    

dataset_columns = Datacolumn.all(:conditions => ["dataset_id = ?", 6], :order => "columnnr ASC").uniq 

csv_file = CSV.generate do  |csv|                                                                                                           
   csv << "here put one after another all my data columns"
end

編集:

ダグラスの提案に基づいて、私は以下のコールドを思いついた。

 data_columns=Datacolumn.all(:conditions => ["dataset_id = ?", dataset.id], :order => "columnnr ASC").uniq

    CSV.generate do |csv|
        value=Array.new 
        data_columns.each do |dc|
          value << dc.columnheader
          dc.sheetcells.each do |sc|
            if sc.datatype && sc.datatype.is_category? && sc.category 
              value << sc.category.short
            elsif sc.datatype && sc.datatype.name.match(/^date/) && sc.accepted_value
              value << sc.accepted_value.to_date.to_s
            elsif sc.accepted_value
              value << sc.accepted_value
            else
              value << sc.import_value
            end 
          end 
          csv << value
          value = Array.new 
        end 
      end 

この場合、出力は転置されず、次のようになります。

height,10,2,<1,na
fullauthor,Fortune,(Siebold & Zucc.) Kuntze,Fortune,(Siebold & Zucc.) Kuntze
Year,1850,1891,1850,1891
fullname,Mahonia bealei,Toxicodendron sylvestre,Mahonia bealei,Toxicodendron sylvestre

しかし、csvを書き込む行を変更すると

csv << value.transpose

文字列を配列に変換できなかったことを示すエラーが表示されます。誰かこれを修正する方法のアイデア?

これに関する助けをいただければ幸いです。

最高のクラース

4

1 に答える 1

4

Array#transpose行を列に反転するを使用できます。簡単な例:

> a = [['name', 'charles', 'dave'],['age', 24, 36],['height', 165, 193]]
=> [["name", "charles", "dave"], ["age", 24, 36], ["height", 165, 193]]
> a.transpose
=> [["name", "age", "height"], ["charles", 24, 165], ["dave", 36, 193]]

dataset_columnsしたがって、が配列であると仮定します。

require 'csv'    

dataset_columns = Datacolumn.all(:conditions => ["dataset_id = ?", 6], :order => "columnnr ASC").uniq 

csv_file = CSV.generate do  |csv|                                                                                                           
   csv << dataset_columns.transpose
end
于 2012-10-25T09:44:12.330 に答える