From: "William James" <> Date: 2009-03-06T05:53:32+09:00 Subject: Re: Please help with fixing output lionbarrage wrote: > Hi all, > > I'm having trouble with a hash output. > > The original files are: > File 1 > ALPHA|OMEGA|GAMMA > 1|2|3 > 4|5|6 > > File 2 > EPSILON|GREEK|OMEGA|BETA > 7|8|9|0 > 12||13| > 10|11|5|15 > > > and I'm using the following code: > > sets = Hash.new { | h, k | h[k] = [] } # hash that contains a new > array > # for every new key > %w(file1.txt file2).each do | filename | > File.open(filename) do | f | > names = f.gets.chop.split('|') > f.each do | line | > names.zip(line.chop.split('|')).each do | name, value | > sets[name] << value.to_i if value and value !~ /^\s*$/ > end > end > end > end > > sets.values.each { | a | a.uniq! } > > puts sets.keys.map { | k | '%8s ' % k }.join('|') > > rows = sets.values.map { | a | a.size }.max > > (1..rows).zip(*sets.values) do | row | > row.shift > puts row.map { | v | if v then '%8s ' % v else ' '*9 end }.join > ('|') > end > > but the output seems a little strange and I'm not sure why that is. > > Output should be > ALPHA | OMEGA | GAMMA | EPSILON | GREEK | BETA > 1 | 2 | 3 | | | > 4 | 5 | 6 | 10 | 11 | 15 > | 9 | | 7 | 8 | 0 > | 13 | | 12 | | > > instead it gets: > ALPHA | OMEGA | GAMMA | EPSILON | GREEK | BETA > 1 | 2 | 3 | 7 | 8 | 0 > 4 | 5 | 6 | 12 | 11 | 15 > | 9 | | 10 | | > | 13 | | | | > > Please advise on what's going on. > > Thanks Try this. sets = Hash.new{ |h, k| h[k] = [] } the_keys = [] row = 0 %w(file1.txt file2).each{ |filename| File.open(filename){ |f| names = f.gets.strip.split('|') the_keys << names f.each{ |line| line.strip.split("|").each_with_index{|v,i| sets[ names[i] ][ row ] = v.strip } row += 1 } } } the_keys = the_keys.flatten.uniq sets.values.each{ |a| a.uniq! } puts the_keys.map{ |k| '%8s ' % k }.join('|') rows = sets.values.map{ |a| a.size }.max rows.times{|i| puts the_keys.map{|k| v = sets[k][i] || "" "%8s " % v }.join( "|" ) }