2012-10-25 20 views
0

我喜欢使用内置的csv轨道库从我的rails应用程序导出一个数据集作为csv文件。通常一个CSV文件写入行明智就像在我下面的例子这来自我的datasets_controller.rb:Rails写一个csv文件明智的列

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 

编辑:

基于我想出了下面的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 

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

任何帮助,这将不胜感激。

最佳克拉斯

回答

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 
+0

感谢您的帮助。这正是我需要的。我根据您的建议创建了一些代码(请参阅编辑)。我仍然有一些麻烦让转置工作。 – ctpfaff