テーブル形式のルビーハッシュをファイルにすばやく印刷する方法はありますか? ような:ハッシュの値は、異なるサイズのアレイであるRubyハッシュをテーブル形式ですばやく印刷するにはどうすればいいですか?
keyA keyB keyC ...
123 234 345
125 347
4456
...
。または、唯一の方法でダブルループを使用していますか?
おかげで
テーブル形式のルビーハッシュをファイルにすばやく印刷する方法はありますか? ような:ハッシュの値は、異なるサイズのアレイであるRubyハッシュをテーブル形式ですばやく印刷するにはどうすればいいですか?
keyA keyB keyC ...
123 234 345
125 347
4456
...
。または、唯一の方法でダブルループを使用していますか?
おかげで
ここで配列が同じサイズでない場合に動作します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, ""]
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]]
配列の長さが同じであれば動作します。 – Larsenal
いいえ、組み込み関数はありません。
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...
答えを洗練するためのコメントと編集は大変歓迎されています。
は(表にハッシュ、ルビーオブジェクト、ActiveRecordのオブジェクトを出力します)私が書いたこの宝石を試してみてください:http://github.com/arches/table_print
tpは与えられたハッシュでは動作しませんが、ARオブジェクトで動作します。私がハッシュを試したとき、これは=> table_print-1.0.1/lib/table_print/fingerprinter.rb:38: 'populate_rowのブロック 'にあります。 –
一般に、ハッシュを扱います。動作していない場合は、http://github.com/arches/table_printで問題を開いてください。または、問題([email protected]) –
をメールで送信してください。探している人ではありませんが、テーブルのものについては、それは最高のものに見えます –
最も簡単には、「ダブルループ」であるが、それはまだワンライナーです。それはとても悪いですか? –
IMOそれはあまりにも組み込み機能に特化しており、 "手で"行うのはあまりにも簡単です:) –
誰かが簡単なワンライナーを投稿するのは悪くないでしょう。 :-) – Larsenal