Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

printing output on text file from file - perl

by Perlseeker_1 (Acolyte)
on Oct 15, 2013 at 15:46 UTC ( #1058311=perlquestion: print w/replies, xml ) Need Help??

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

Hi Experts,

I have created a hash which takes value and store as mentioned below

Hash output

$VAR1 = [ 'AB', '1', 'Traverse' ]; $VAR2 = [ 'AB', '3', 'Traverse' ]; $VAR3 = [ 'CD', '2', 'Traverse' ]; $VAR4 = [ 'CD', '2', 'Traverse' ]; $VAR1 = [ 'JK', '1', 'Traverse1' ]; $VAR2 = [ 'JK', '3', 'Traverse1' ]; $VAR3 = [ 'KJ', '2', 'Traverse1' ]; $VAR4 = [ 'KJ', '2', 'Traverse1' ];

Output Expected

Traverse AB 4 CD 4 Subtotal 8 Traverse1 JK 4 KJ 4 Subtotal 8 Total 16

My code

my $size = scalar(@f); for ( my $i=0;$i<$size;$i++ ) { my $key = "$f[$i]->[0]"; $result{$key}->[0] += $f[$i]->[1]; }

i want output as mentioned below,I am expecting output as below

Traverse AB 4 CD 4 Subtotal 8 Traverse1 JK 4 KJ 4 Subtotal 8 Total 16

Thanks and regards

Replies are listed 'Best First'.
Re: printing output on text file from file - perl
by mtmcc (Hermit) on Oct 15, 2013 at 15:57 UTC
    Where is your hash? And what is in @f? I'd suggest having a look through perlref.
Re: printing output on text file from file - perl
by Eily (Monsignor) on Oct 15, 2013 at 16:08 UTC

    What you call a hash actually seems to be at least one array of arrays. And giving us a dump of your datastructure is a good idea, but it works better if you pass a reference (by adding \ in front of your variables) rather than the hash or array directly. In your case that would probably be something like :

    use Data::Dumper; my @array = somecode(); print Dumper \@array;
    or if you actually have a hash: print Dumper \%hash; this will ensure that your list or hash element is transmitted whole, and not flattened into several arguments.

    I'd add perldsc to mtmcc's answer, to obtain a better understanding of Perl data structures. And most of times in Perl, you don't have to use indexes to iterate through an array, you can just write

    for my $element (@f) { my $key = $element->[0]; ... }
    .

      Hi Experts,

      The input file has data, as shown below

      File - 1 - Animals A RACK 2 2 B RACK 2 2 C RACK 2 2 D RACK 2 2 FIle - 2 - Fruits A RACK 2 2 B RACK 2 2 C RACK 2 2 D RACK 2 2 File - 3 - Vegetables E TACK 4 2 F TACK 4 2 G TACK 4 2 H TACK 4 2

      The output i am expecting shown below

      Rack A 4 4 B 4 4 C 4 4 D 4 4 Subtotal16 16 Rack E 4 2 F 4 2 G 4 2 H 4 2 Subtotal16 8 Total 32 24
Re: printing output on text file from file - perl
by Kenosis (Priest) on Oct 15, 2013 at 17:13 UTC
    • With "Animals, fruit and vegetables--oh, my!" in your data set, is this a homework assignment?
    • Posting your complete code, in this case, would be helpful when asking for assistance.
    • You forgot to ask a question.
Re: printing output on text file from file - perl
by kcott (Bishop) on Oct 15, 2013 at 18:35 UTC

    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

      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

Re: printing output on text file from file - perl
by Generoso (Prior) on Oct 15, 2013 at 16:35 UTC

    This looks more like 3 tables in a database, is this the case?

    Me I suggest you take a look at DBD::CSV

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1058311]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (3)
As of 2022-05-17 23:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Do you prefer to work remotely?



    Results (68 votes). Check out past polls.

    Notices?