2011-10-26 18 views
5

テーブル形式のルビーハッシュをファイルにすばやく印刷する方法はありますか? ような:ハッシュの値は、異なるサイズのアレイであるRubyハッシュをテーブル形式ですばやく印刷するにはどうすればいいですか?

keyA keyB keyC ... 
123 234 345 
125   347 
4456 
... 

。または、唯一の方法でダブルループを使用していますか?

おかげで

+2

最も簡単には、「ダブルループ」であるが、それはまだワンライナーです。それはとても悪いですか? –

+0

IMOそれはあまりにも組み込み機能に特化しており、 "手で"行うのはあまりにも簡単です:) –

+0

誰かが簡単なワンライナーを投稿するのは悪くないでしょう。 :-) – Larsenal

答えて

4

ここで配列が同じサイズでない場合に動作しますsteenslag年代のバージョンです:で、

size = h.values.max_by { |a| a.length }.length 
m = h.values.map { |a| a += [nil] * (size - a.length) }.transpose.insert(0, h.keys) 

nilは、欠損値のための合理的なプレースホルダのように思えるが、あなたのことができもちろん、意味のあるものを使用してください。例えば

>> h = {:a => [1, 2, 3], :b => [4, 5, 6, 7, 8], :c => [9]} 
>> size = h.values.max_by { |a| a.length }.length 
>> m = h.values.map { |a| a += [nil] * (size - a.length) }.transpose.insert(0, h.keys) 
=> [[:a, :b, :c], [1, 4, 9], [2, 5, nil], [3, 6, nil], [nil, 7, nil], [nil, 8, nil]] 
>> m.each { |r| puts r.map { |x| x.nil?? '' : x }.inspect } 
[:a, :b, :c] 
[ 1, 4, 9] 
[ 2, 5, ""] 
[ 3, 6, ""] 
["", 7, ""] 
["", 8, ""] 
2
h = {:a => [1, 2, 3], :b => [4, 5, 6], :c => [7, 8, 9]} 
p h.values.transpose.insert(0, h.keys) 
# [[:a, :b, :c], [1, 4, 7], [2, 5, 8], [3, 6, 9]] 
+1

配列の長さが同じであれば動作します。 – Larsenal

1

いいえ、組み込み関数はありません。

data = { :keyA => [123, 125, 4456], :keyB => [234000], :keyC => [345, 347] } 

length = data.values.max_by{ |v| v.length }.length 

widths = {} 
data.keys.each do |key| 
    widths[key] = 5 # minimum column width 

    # longest string len of values 
    val_len = data[key].max_by{ |v| v.to_s.length }.to_s.length 
    widths[key] = (val_len > widths[key]) ? val_len : widths[key] 

    # length of key 
    widths[key] = (key.to_s.length > widths[key]) ? key.to_s.length : widths[key] 
end 

result = "" 
data.keys.each {|key| result += key.to_s.ljust(widths[key]) + " " } 
result += "\n" 

for i in 0.upto(length) 
    data.keys.each { |key| result += data[key][i].to_s.ljust(widths[key]) + " " } 
    result += "\n" 
end 

# TODO write result to file... 

答えを洗練するためのコメントと編集は大変歓迎されています。

3

は(表にハッシュ、ルビーオブジェクト、ActiveRecordのオブジェクトを出力します)私が書いたこの宝石を試してみてください:http://github.com/arches/table_print

+0

tpは与えられたハッシュでは動作しませんが、ARオブジェクトで動作します。私がハッシュを試したとき、これは=> table_print-1.0.1/lib/table_print/fingerprinter.rb:38: 'populate_rowのブロック 'にあります。 –

+0

一般に、ハッシュを扱います。動作していない場合は、http://github.com/arches/table_printで問題を開いてください。または、問題([email protected]) –

+0

をメールで送信してください。探している人ではありませんが、テーブルのものについては、それは最高のものに見えます –

関連する問題