如何以表格格式快速打印Ruby哈希?

时间:2011-10-26 14:38:17

标签: ruby arrays hash

有没有办法快速将表格格式的ruby哈希打印到文件中? 如:

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

其中哈希值是不同大小的数组。或者只使用双循环?

由于

4 个答案:

答案 0 :(得分: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, ""]

答案 1 :(得分:3)

尝试我编写的这个gem(打印哈希,ruby对象,表中的ActiveRecord对象):http://github.com/arches/table_print

答案 2 :(得分: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]]

答案 3 :(得分: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...

非常欢迎任何评论和编辑以完善答案。

相关问题