2012-10-25 55 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