From: lionbarrage Date: 2009-03-06T08:23:35+09:00 Subject: Re: Please help with fixing output On Mar 5, 12:51 pm, "William James" <> wrote: > 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( "|" ) > > } > > Unfortunately no luck, it did the first row right, but the 2nd row is supposed to contain 4,5,6,10,11,15 . 7.8.9 should have |||7|8|9 ALPHA | OMEGA | GAMMA | EPSILON | GREEK | BETA 1 | 2 | 3 | | | 4 | 5 | 6 | 7 | 8 | 0 | 9 | | 12 | | 15 | 13 | | 10 | 11 |