in reply to Re: Associated lists to matrices - and accumalted integers
in thread RESOLVED - Associated lists to matrices - and accumalted integers

Hi, thanks. Sorry, from that I still dont get how I can parse a file like this..
id1 id2 int HAT KNIFE 1 HAT KNIFE 7 BALL KNIFE 3 CAT CLOTH 1 DOG CLOTH 2
To produce a table like this (notice KNIFE and HAT total is 8). Its 2am here, and would love to get this down else my wife is going to kill be if Im stuck on this all weekend. So your help much appreciated, first time I have asked for help like this.
CLOTH KNIFE BALL 0 3 HAT 0 8 DOG 1 0 CAT 1 2

Replies are listed 'Best First'.
Re^3: Associated lists to matrices - and accumalted integers
by JavaFan (Canon) on Nov 06, 2009 at 15:19 UTC
    Change the second = in my code to +=.
      I think I am getting it now... I so dumb I was trying out a way to add them up in the matrix, when your simple solution is to add them up before! Whay didn't I think of that first!
      list ---- HAT KNIFE 1 HAT KNIFE 7 BALL KNIFE 3 CAT CLOTH 1 DOG CLOTH 2 code ---- my %matrix; while (<>) { my ($id1, $id2, $int) = split; $matrix{$id1}{$id2} += $int; } foreach $key1 (keys %matrix) { foreach $key2 (keys %{%matrix->{$key1}}) { print "\$matrix{$key1}{$key2} = $matrix{$key1}{$key2} +"; } print"\n"; + } output ------ $matrix{CAT}{CLOTH} = 1 $matrix{DOG}{CLOTH} = 2 $matrix{HAT}{KNIFE} = 8 $matrix{BALL}{KNIFE} = 3
      Last question please.. do you have a good code snippet to put it in the matrix afterwoods please?
      CLOTH KNIFE BALL 0 3 HAT 0 8 DOG 1 0 CAT 1 2
        my @down = keys %matrix; my @across = do {my %s; grep {!$s{$_}++} map {keys %$_} values %matrix +}; my $l = 0; $l < length ($_) and $l = length $_ for @down, @across; print " " x $l; printf " %-${l}s", $_ for @across; print "\n"; foreach my $d (@down) { printf "%-${l}s", $d; printf " %${l}d", $matrix{$d}{$_} || 0 for @across; print "\n"; }