2016-05-28 5 views
-3

にヒストグラムハッシュを変換:Rubyは私がこのようになりますハッシュ持つCSV

|  | Date 1 | Date 2 | Date 3 | 
| Item 1 | 1 | 2 | 5 | 
| Item 2 |  | 7 | 2 | 
| Item 4 | 3 |  | 3 | 
| Item 5 |  | 1 |  | 
| Item 8 |  |  | 8 | 
:私はこのようになります日間のヒストグラムCSVファイルでの日にそれを変換したい

@histogram = { 
    "Date 1" => [ 
    {"Item 1" => 1}, 
    {"Item 4" => 3} 
    ], 
    "Date 2" => [ 
    {"Item 2" => 7}, 
    {"Item 1" => 2}, 
    {"Item 5" => 1} 
    ], 
    "Date 3" => [ 
    {"Item 4" => 3}, 
    {"Item 2" => 2}, 
    {"Item 8" => 1}, 
    {"Item 1" => 5} 
    ] 
} 

私を引きつけるのは、@histogramハッシュが完全に順不同であるという事実です。日付(keys)は順番になる可能性が高いですが、アイテムは完全に順不同です。さらに、見ることができるように、アイテムは異なる日付で同じである必要はありません。あるアイテムが特定の日付に存在しない場合、ヒストグラムの量は0とみなすことができます。

+0

あなたが簡単にあなたのCSVを構築するために一時データ構造でそのハッシュの内容の再パッケージのビットをしなければならないようです。あなたがそのアイデアをとってそれを使って走ったとします。どのような種類のコードを作ることができるのだろうか。 – MarsAtomic

+0

あなたの最初の問題は、ソートを使うことです。 2番目の場合は、事前にキーの組み合わせを取得します。 – ndn

答えて

0

Date1値のハッシュの配列はあまりありませんが、それは単一ハッシュ複数のキーがあります。あなたの@histogramの構造は、好ましくは、以下のようにする必要があります:

{"Date 1"=>{"Item 1"=>1, "Item 4"=>3}, 
"Date 2"=>{"Item 2"=>7, "Item 1"=>2, "Item 5"=>1}, 
"Date 3"=>{"Item 4"=>3, "Item 2"=>2, "Item 8"=>1, "Item 1"=>5}} 

したがって、私は上記の構造に@histogramを変換し、その上に構築するソリューションを提供します。

processed_hash = @histogram.map {|k,v| [k, v.reduce(&:merge)]}.to_h 

column_headers = processed_hash.keys 
row_headers = processed_hash.flat_map{ |k, v| v.keys}.uniq.sort 

print "|" + "".center(10) + "|" 
column_headers.each {|ch| print ch.center(10) + "|"} 
puts 
row_headers.each do |rh| 
    print "|" + rh.center(10) + "|" 
    column_headers.each {|ch| print processed_hash.dig(ch, rh).to_s.center(10) + "|"} 
    puts 
end 

出力:

|   | Date 1 | Date 2 | Date 3 | 
| Item 1 | 1  | 2  | 5  | 
| Item 2 |   | 7  | 2  | 
| Item 4 | 3  |   | 3  | 
| Item 5 |   | 1  |   | 
| Item 8 |   |   | 1  | 
関連する問題