Rails明智地写一个csv文件

我喜欢使用内置的csv rails库将我的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 

编辑:

根据Douglas的建议,我想出了下面的colde。

  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 

我收到一个错误,告诉我它无法将字符串转换为数组来执行此操作。 任何人都有想法如何解决这个问题?

任何帮助都将不胜感激。

最好的克拉斯

您可以使用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