John Doe wrote:

Andrej Kastrin am Montag, 30. Januar 2006 10.14:
Dear all,

I have bar separated file:
name1|345
name2|201
...

I store it into a hash;
while (<FILE_A>) {
  chomp;
  ($name,$score) = split (/\|/,$_);
  $hash{$name} = $score;
}

Let's assume the resulting hash is %scores.

Then I have second file:
ID - 001
NA - name1
NA - name2

ID - 002
NA - name2
NA - name4
...

I match all ID's and NA's:

while (<FILE_B>) {
  chomp;
  if (/^ID/ {
      $ID = substr($_,5);
  }
   elseif (/^NA/) {
       $NA = substr($_,5)
}


Now I have to do somethig like;
001 | 345+201
So, I want to read ID and NA fields from second file and then with each
ID print the sum of scores from first file.
Any suggestion. Which structure should I use to do that. Thank's in
advance.

Now you could parse FILE_B and use another twodimensional hash to accumulate the scores by ID for each name. The loop could look like (untested):

my %sums;
my $id;
while (<FILE_B>) {
  chomp;
  next if (($id)=$_=~/^ID - (\d+)/);
  next unless my ($na)=$_=~/^ID - (\w+)/;
  $sums{$id}->{$na}+=$scores{$na};
}

foreach my $id (sort keys %sums) {
  print "ID $id\n";
  foreach my $name (sort keys %{$sums{$id}}) {
print "name: $name - scores: ", $sums{$id}->{$name}, "\n";
  }
}

(All handling of possible errors is missing here)


hth,
joe


I'm totally confused now and I have no more ideas... Thank's for your reply Joe, but I didn't manage. Here is the more real example:

First file: (I modify it)
270|Germany|Hospitals|Poland
272|Germany|History
273|Physiology|Poland|Portraits

Second file:
Germany|100
History|200
Hospitals|50
Poland|50
Physiology|10
Portrait|10

Output file:
270|100|50|50|200 #270 is the key in table 1; 100, 50, 50 are values for nouns from second file, 200 is the sum of them

272|100|200|300
273|10|50|10|70

I study this problem for 5 hours now, but I'm afraid I can't d it myself.

Cheers, Andrej

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to