2011-10-26 10 views
5

Czy istnieje sposób szybkiego wydrukowania skrótu ruby ​​w formacie tabeli do pliku? Przykładowo:Jak szybko wydrukować skróty Rubiego w formacie tabeli?

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

gdzie wartości hash są matryce o różnych rozmiarach. Lub używa podwójnej pętli jedyny sposób?

Dzięki

+2

Najprostsza jest „podwójna pętla”, ale to wciąż jedna wkładka; czy to takie złe? –

+0

IMO jest zbyt wyspecjalizowana, aby być wbudowaną funkcją, i zbyt łatwe do zrobienia "ręcznie" :) –

+0

Nie byłoby źle, gdyby ktoś opublikował prosty jednolinijkowy. :-) – Larsenal

Odpowiedz

4

Oto wersja steenslag-tych, który działa, gdy tablice nie są tej samej wielkości:

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 wydaje się rozsądnym zastępczy dla brakujących wartości, ale można, z Oczywiście, używaj tego, co ma sens.

Na przykład:

>> 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

Działa tak długo, jak tablice są tej samej długości. – Larsenal

1

Nie, nie ma wbudowaną funkcję. Oto kod, który będzie sformatować go jak chcesz:

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... 

Wszelkie komentarze i edytuje udoskonalić odpowiedzi są bardzo mile widziane.

3

Spróbuj gem napisałem (Wydruki mieszań, obiektów Ruby obiektów ActiveRecord w tabelach): http://github.com/arches/table_print

+0

tp nie działa na hash dać, działa na obiekt AR. Kiedy próbowałem na hasza, otrzymuję to => table_print-1.0.1/lib/table_print/fingerprinter.rb: 38: w 'bloku w populate_row ' –

+0

Ogólnie działa na hashe. Jeśli to nie działa, proszę otworzyć problem na http://github.com/arches/table_print lub napisz do mnie o problemie ([email protected]) –

+0

błąd zniknął po aktualizacji do najnowszej wersji, wciąż jego nie ten, którego szukam, ale jeśli chodzi o stół, wygląda najlepiej –

Powiązane problemy