Please help with fixing output


#1

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


#2

lionbarrage wrote:

10|11|5|15
f.each do | line |

Output should be
ALPHA | OMEGA | GAMMA | EPSILON | GREEK | BETA
1 | 2 | 3 | | |
4 | 5 | 6 | 10 | 11 | 15
| 9 | | 7 | 8 | 0
| 13 | | 12 | |

This doesn’t look right. Consider the Epsilon column.
In the file the column is

7
12
10

And you want the output to be

10
7
12


#3

On Mar 5, 12:51 pm, “William J.” <> wrote:

                                    # for every new key

end
instead it gets:
Try this.
line.strip.split("|").each_with_index{|v,i|
sets.values.each{ |a| a.uniq! }

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 |


#4

On Mar 5, 4:43 pm, “William J.” removed_email_address@domain.invalid wrote:

12||13|
f.each do | line |

Output should be
12
10

And you want the output to be

10
7
12

Ahh, I see where it causes confusion. The idea is to combine the two
columns using Omega.

So the row
ALPHA|OMEGA|GAMMA
4|5|6 in file 1 and the row
EPSILON|GREEK|OMEGA|BETA
10|11|5|15
in file 2 gets combined but the rest, who don’t have a match in the
other file, does not.


#5

On Mar 6, 10:04 am, lionbarrage removed_email_address@domain.invalid wrote:

                                    # for every new key

end
This doesn’t look right. Consider the Epsilon column.
12
other file, does not.
I am still confused on how to do this. Tried using SQL Lite but Full
outer joins are not supported. Any ideas would be great!

Thanks!