in reply to printing output on text file from file - perl

G'day Perlseeker_1,

Both this, and your subsequent post, seem poorly worded and lacking information. I do not appear to be alone in having trouble understanding exactly what you want. Please read "How do I post a question effectively?" to see how to improve your posts.

This general class of problem looks like a simple case of reading files and keeping track of totals. Given your second post has input data and some indication of the output (I've guessed at how you get 2x"Rack" from 8x"RACK" and 4x"TACK"), here's some simple code to accumulate totals and output the results.

#!/usr/bin/env perl -l use strict; use warnings; use Inline::Files; my @file_handles = \(*ANIMALS, *FRUITS, *VEGETABLES); my %data; for my $fh (@file_handles) { while (<$fh>) { my ($id, $type, $val1, $val2) = split; $data{in}{$type}{$id}{val1} += $val1; $data{in}{$type}{$id}{val2} += $val2; $data{subtotal}{$type}{val1} += $val1; $data{subtotal}{$type}{val2} += $val2; $data{total}{val1} += $val1; $data{total}{val2} += $val2; } } for my $type (sort keys %{$data{in}}) { print $type; for (sort keys %{$data{in}{$type}}) { print join("\t" => $_, @{$data{in}{$type}{$_}}{qw{val1 val2}}) +; } print join("\t" => 'Sub', @{$data{subtotal}{$type}}{qw{val1 val2}} +); } print join("\t" => 'Tot', @{$data{total}}{qw{val1 val2}}); __ANIMALS__ A RACK 2 2 B RACK 2 2 C RACK 2 2 D RACK 2 2 __FRUITS__ A RACK 2 2 B RACK 2 2 C RACK 2 2 D RACK 2 2 __VEGETABLES__ E TACK 4 2 F TACK 4 2 G TACK 4 2 H TACK 4 2

Output:

RACK A 4 4 B 4 4 C 4 4 D 4 4 Sub 16 16 TACK E 4 2 F 4 2 G 4 2 H 4 2 Sub 16 8 Tot 32 24

If you are unable to adapt this to your requirements, ensure you adhere to the guidelines in "How do I post a question effectively?" when asking any follow-up questions.

-- Ken

Replies are listed 'Best First'.
Re^2: printing output on text file from file - perl
by Perlseeker_1 (Acolyte) on Oct 19, 2013 at 04:03 UTC
    Hi Experts,

    Thanks for the responses

    I got the requireq out put, but when i tired to add zero if no value is defined for a variable,i didnt get the required output

    #!/usr/bin/env perl -l use strict; use warnings; use Inline::Files; my @file_handles = \(*ANIMALS, *FRUITS, *VEGETABLES); my %data; for my $fh (@file_handles) { while (<$fh>) { my ($id, $type, $val1, $val2) = split; if ($val1 eq ""){ $val1 = "0.00"; } $data{in}{$type}{$id}{val1} += sprintf "%.2f", $val1; $data{in}{$type}{$id}{val2} += sprintf "%.2f", $val2; $data{subtotal}{$type}{val1} += sprintf "%.2f", $val1; $data{subtotal}{$type}{val2} += sprintf "%.2f", $val2; $data{total}{val1} += $val1; $data{total}{val2} += $val2; } } for my $type (sort keys %{$data{in}}) { print $type; for (sort keys %{$data{in}{$type}}) { print join("\t" => $_, @{$data{in}{$type}{$_}}{qw{val1 val2}}) +; } print join("\t" => 'Sub', @{$data{subtotal}{$type}}{qw{val1 val2}} +); } print join("\t" => 'Tot', @{$data{total}}{qw{val1 val2}});

    Output

    RACK A 0 0 B 0 0 C 0 0 D 0 0 Sub 0 0 TACK E 0 0 F 0 0 G 0 0 H 0 0 Sub 0 0 Tot 0 00

    please guide me where i went wrong

    Thanks