2010-01-23 29 views
2

我有一個散列哈希(@post),我想將它保存到csv。對我來說奇怪的是,我的方法適用於標題,但不適用於行。如果我使用如何將散列轉換爲特定順序的數組? (紅寶石)

csv << (@post_csv_order.each {|element| puts single_post[element]})

顯示行,我可以在屏幕上看到的右弦,但CSV文件中包含的哈希鍵不是哈希值的值的值。基本上我在我的csv中有5行標題,而不是正確的值。

我想我需要將@post [key]散列轉換爲基於@post_csv_order(包含@post [key]散列鍵)的順序的數組有一個散列方法to_a但它不會給我我需要的訂單。

我想你可能會建議不同的方法,而不是使用散列哈希,但我也想知道如何將散列轉換爲具有一些預定義的順序的數組

另一方面,如果有任何簡單的方法如何保存散列哈希到csv /表我很高興重寫我的代碼。

require 'rubygems' 
    require 'faster_csv' 
    require 'pp' 

    @post = {123 => {"ForumID" => "123", "Post author" => "Thom" }, 
      222 => {"ForumID" => "222", "Post author" => "Mark"}, 
      345 => {"ForumID" => "345", "Post author" => "Eddy"}, 
      444 => {"ForumID" => "444", "Post author" => "Eli"}} 
    @post_csv_order = [ 
         "ForumID" , 
         "Post author" 
        ] 

    FasterCSV.open("test.csv", "w", { :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true, :return_headers => false, :force_quotes => true}) do |csv| 
    csv << (@post_csv_order.each {|element| element}) 
     @post.each_value do |single_post| 
     csv << (@post_csv_order.each {|element| single_post[element]}) 
    #csv << (@post_csv_order.each {|element| puts single_post[element]}) 
     end 
    end 

回答

3

這條線:

csv << @post_csv_order.each {|element| single_post[element]} 

環比@post_csv_order數組,並返回數組本身,這是不是你想要的。在這種情況下,each和塊實際上沒有做任何事情。如果更改eachmap它會做你想要什麼:

csv << @post_csv_order.map {|element| single_post[element]} 

map返回一個包含塊的每個調用的結果一個新的陣列。

+0

@Theo:謝謝你的解決方案。我不明白爲什麼爲標題工作的'csv <<(@ post_csv_order.each {| element | element})工作 – Radek

+1

它的工作原理是'csv << @ post_csv_order','@ post_csv_order'包含標題。 '.each {| element |元素}'(除了本身沒有操作)沒有效果。 'each'返回數組本身,即消息的接收者。 'each'只是一個循環構造,它只有在循環有副作用時纔有用,你的循環不會。你使用'each'就好像它是'map'一樣。 – Theo