2013-10-21 58 views
0

我正在使用一個不幸只允許我以csv格式下載信息的API。我想要的唯一選擇是逐一下載〜100個CSV文件,將csv文件的每一列存儲到一個數組中,然後在完成時刪除該CSV文件。每個文件都包含在同一列標題,但他們以不同的順序:使用Ruby根據標題名稱映射多個CSV文件

#CSV File 1 

column1 | column3 | column2 

#CSV File 2 

column1 | column2 | column3 

我如何寫一個腳本來添加每一列到它的合適的陣列(column1column2column3)?我目前人爲製造像這樣列,但嚴格來說這是基於列編號,沒有名字:

column1 = [] 
column2 = [] 
column3 = [] 

CSV.foreach(csv_file, :col_sep => "," :headers => false) do |column| 

    column1 << column[0] 
    column2 << column[1] 
    column3 << column[2] 
end 

回答

1

使用CSV庫,你可以用它在報頭中的名稱訪問的每一列。所以,如果你總是有相同的標題儘管以不同的順序,你可以這樣做:

CSV.foreach(csv_file, :col_sep => "," :headers => true) do |row| 
    do_whatever_you_want_with(row['your_header']) 
end 
+0

這就是我所需要的 - 我通讀了文檔,但沒有意識到我可以將行稱爲標題名稱。謝謝你的提示。 – Luigi

1

我倒是覺得這樣做將建立一個數組哈希表,像這種最簡單的事情:

require 'csv' 

data = Hash.new 
array_of_csv_filenames.each do |file| 
    csv = CSV.read(file, :headers => true) 
    csv.by_col! 

    csv.each do |name, values| 
     data[name] = Array.new unless data[name] 
     data[name].concat values 
    end 
end 

然後,最後,數據將包含按列名稱鍵入的列的散列。

+0

+1提示和向我介紹一些新的方法/想法;然而,我認爲有時候我會更容易將它們保存爲數組,因爲腳本的其餘部分依賴於當前的數據。 – Luigi

相關問題