mmittiga17 has asked for the wisdom of the Perl Monks concerning the following question:

I am trying to add the returned values from a hash to get the combined total value for the same key.
ID,Value
FB208025,1629.01
FB208025,1201.16


FB091027,1257.66
FB091027,741.92

FB135022,11210.66
FB135022,3238.67
FB135022,3569.34
FB135022,5534.23

I want to get total combined value for each ID:
FB135022=11210.66+3238.67+3569.34+5534.23
my %baldata; while (defined($line = <IN>)) { if ($line =~/caus/){ $ACTNUM = (split(/\t/,$line))[0]; $CSHBAL1 = (split(/\t/,$line))[17] ; $baldata{$ACTNUM}{$CSHBAL1} = ($ACTNUM,$CSHBAL1); $CSHBAL2 = $baldata{$ACTNUM}{$CSHBAL1}; print "$ACTNUM,$CSHBAL1,$CSHBAL2\n"; } } I can get the value for each KEYID everytime it appears, just can not +figure out how to add the values up for each individual ID. Any help + will be appreciated.

Replies are listed 'Best First'.
Re: Getting combined values via a hash
by kennethk (Abbot) on Jul 16, 2009 at 19:41 UTC

    First, please read How (Not) To Ask A Question and Markup in the Monastery, since you have not really provided us with the input you are really consuming and you have not followed site protocol in terms of appropriate mark-up.

    I note that line 6 of the code you gave us, you are assigning a list to a scalar. This will result in only the first value being stored in your hash of hashes and the second being put on the rubbish heap. Perhaps you meant to use square brackets to make it an anonymous array reference (see perllol).

    Given that your stated intention is just to sum up the associated values, you certainly do not need a data structure as complex as the one you have used here. You need only use a simple hash, keyed on your KEYIDs and accumulate values using += (Assignment Operators). Something like this, perhaps:

    use strict; use warnings; my %baldata; while (defined(my $line = <DATA>)) { next unless $line =~ /^FB/; my ($key,$value) = split /\,/, $line; $baldata{$key} += $value; } foreach my $key (keys %baldata) { print "$key => $baldata{$key}\n" } __DATA__ ID,Value FB208025,1629.01 FB208025,1201.16 FB091027,1257.66 FB091027,741.92 FB135022,11210.66 FB135022,3238.67 FB135022,3569.34 FB135022,5534.23

    Note that, of course, the above code will not work with your original file.

Re: Getting combined values via a hash
by mzedeler (Pilgrim) on Jul 16, 2009 at 19:42 UTC

    I have no idea what your code is trying to accomplish - if you want to add things together, there should at least be a + somewhere, but I guess you want all the sums in a hash, right?

    use warnings; use strict; my %sum; while(my($id, $value) = split ',', <IN>) { $sum{$id} += $value; }

    Please do remember to use both strict and warnings. It will save you a lot of grievances.

Re: Getting combined values via a hash
by bichonfrise74 (Vicar) on Jul 16, 2009 at 20:25 UTC
    Something like this perhaps?
    #!/usr/bin/perl use strict; use Data::Dumper; my %sum; while (<DATA>) { next if ( /^ID/ || /^\s$/ ); my ($id, $value) = split( "," ); $sum{$id} = $sum{$id} + $value; } print Dumper \%sum; __DATA__ ID,Value FB208025,1629.01 FB208025,1201.16 FB091027,1257.66 FB091027,741.92 FB135022,11210.66 FB135022,3238.67 FB135022,3569.34 FB135022,5534.23