in reply to perl file formatting

#!/usr/bin/perl # http://perlmonks.org/?node_id=1178418 use strict; use warnings; sub eightdigitdate { my @fields = localtime(shift); sprintf '%04d%02d%02d', $fields[5] + 1900, $fields[4] + 1, $fields[3 +]; } sub nextday { use Time::Local; shift() =~ /(\d{4})(\d\d)(\d\d)/; eightdigitdate( 60*60*24 + timelocal 0, 0, 12, $3, $2 - 1, $1 ); } #my $today = eightdigitdate(time); my $today = '20161002'; print scalar <DATA>; print my @data = <DATA>; my $more = 1; while($more) { for(@data) { my $date = (split)[1]; if( $date < $today ) { s/\b$date\b/ nextday($date) /e; print; } else { $more = 0; } } } __DATA__ F12 F11 F481 F55 F989 8204 20160930 1064.848 test Y 8204A 20160930 1064.505 test Y 8204B 20160930 1045.469 test Y

Replies are listed 'Best First'.
Re^2: perl file formatting
by perlforsgs (Initiate) on Jan 12, 2017 at 11:26 UTC
    Tried something like this But couldnt get the required ,Any help APPRECIATED
    #!/usr/bin/perl my $isHeader = 1; my $targetDate = 20161002; foreach (<STDIN>){ if (!$isHeader){ my ($M12,$M11,$M481,$M55,$M989) = split(' ',$_); if ($M11 <= $targetDate){ print $_; } } $isHeader = 0; }

      Are your input data columns really separated by a space? In the sample above it looks like it may be tabs, in which case your regexp won't match. Maybe try:

      split(/\s+/, $_);

      Hope this helps!


      The way forward always starts with a minimal test.

        The separator is comma ,yes missed that in my snippet and I also need the date to be dynamically retrieved based on the current date of processing ,rather than hardcoded date

        Actually each fields are separated by comma
      #!/usr/bin/perl # http://perlmonks.org/?node_id=1178418 use strict; use warnings; sub eightdigitdate { my @fields = localtime(shift); sprintf '%04d%02d%02d', $fields[5] + 1900, $fields[4] + 1, $fields[3 +]; } sub nextday { use Time::Local; shift() =~ /(\d{4})(\d\d)(\d\d)/; eightdigitdate( 60*60*24 + timelocal 0, 0, 12, $3, $2 - 1, $1 ); } #my $today = eightdigitdate(time); my $today = '20161002'; print scalar <STDIN>; print my @data = <STDIN>; my $more = 1; while($more) { for(@data) { my $date = (split)[1]; if( $date < $today ) { s/\b$date\b/ nextday($date) /e; print; } else { $more = 0; } } }

        F12 F11 F481 F55 F989 E1 E2 E3

        8204 20160930 1064.848 test Y 10

        8204A 20160930 1064.505 test Y 6 4

        Thanks for all the help.Now things are getting lil more from previous.We have three more columns added E1,E2 ,E3.E3 doesnt have anything as off now .Just a placeholder. Now a new logic must be bulit for as below: F481 = IF (E2 NOT NULL) then (E1 - E2) / 2 ELSE (F481) So after computations the output must be as:

        F12 F11 F481 F55 F989

        8204 20160930 1064.848 test Y

        8204A 20160930 1 test Y

        The final output record format will be as per previous format .The first record meets the else part and hence remain unchanged . The second record gets computed as above.The new columns are never part of actual output