http://www.perlmonks.org?node_id=1002069

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

I want to parse the following text file and return the location whose status is approved and build date is the latest,please provide inputs on the logic.

INPUT:- Build: M1234BAAAANAAW9321.1 Location: \\dreyers\builds468\INTEGRATION\M1234BAAAANAAW9321.1 Comments: Build completed, labeled, and marked for retention. Status: Approved BuildDate: 10/25/2012 12:51:25 Build: M1234BAAAANAAW9321.2 Location: \\crmbld01\Builds\FAILED\M1234BAAAANAAW9321.2 Comments: The build is currently in a failed status. Status: Failed BuildDate: 10/25/2012 19:37:17 Build: M1234BAAAANAAW9321.3 Location: \\freeze\builds427\INTEGRATION\M1234BAAAANAAW9321.3 Comments: Build completed, labeled, and marked for retention. Status: Approved BuildDate: 10/25/2012 19:43:28 OUTPUT:-\\freeze\builds427\INTEGRATION\M1234BAAAANAAW9321.3

Replies are listed 'Best First'.
Re: Parsing a text file to get the location of the latest
by Old_Gray_Bear (Bishop) on Nov 03, 2012 at 02:16 UTC
    Here is how I'd do it:
    1. set newest-date to empty
    2. set this-record to empty
    3. LOOP: read a record
    4. if record is not approved, go to LOOP.
    5. if the build Date is > newest-date then move the record to this-record and set newest-date
    6. goto LOOP
    What does your code look like?

    Update: This code is already"Pythonized". Perhaps your meant "Haskellized"?

    ----
    I Go Back to Sleep, Now.

    OGB

      This one-line does the job (With your current sample data):
      perl -000 -ne '($l,$d)=m/Location:\s+(\S+).+BuildDate:\s+(\d.+\d)/s; ( +$lm,$ld)=($l,$d) if $d gt $ld and m/Approved/s}{print qq|$lm\n|' YOUR +-FILE-NAME.txt
      Note1 - the Date compare logic is very weak - it simply does a textual compare.
      Note2 - "Approved" verification is very weak.
      This is a working sample - you can use it to build a more robust program.
      Change single-quotes to double, if you use Window$.

      Update: Oops - I had intended to respond to the original post - but got OGB's post instead. Sorry.

                   "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."           -Confucius

Re: Parsing a text file to get the location of the latest
by jwkrahn (Monsignor) on Nov 03, 2012 at 04:36 UTC
    $ echo 'Build: M1234BAAAANAAW9321.1 Location: \\dreyers\builds468\INTEGRATION\M1234BAAAANAAW9321.1 Comments: Build completed, labeled, and marked for retention. Status: Approved BuildDate: 10/25/2012 12:51:25 Build: M1234BAAAANAAW9321.2 Location: \\crmbld01\Builds\FAILED\M1234BAAAANAAW9321.2 Comments: The build is currently in a failed status. Status: Failed BuildDate: 10/25/2012 19:37:17 Build: M1234BAAAANAAW9321.3 Location: \\freeze\builds427\INTEGRATION\M1234BAAAANAAW9321.3 Comments: Build completed, labeled, and marked for retention. Status: Approved BuildDate: 10/25/2012 19:43:28 ' | perl -e' local $/ = ""; my ( $build_date, $location ); while ( <> ) { next unless /status:\s+approved/i; my $date = sprintf "%04d%02d%02d%02d%02d%02d", ( /builddate:\s+(\d ++)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)/i )[ 2, 0, 1, 3, 4, 5 ]; if ( !defined $build_date || $build_date lt $date ) { ( $build_date, $location ) = ( $date, /location:\s+(.+)/i ); } } print "$location\n"; ' \\freeze\builds427\INTEGRATION\M1234BAAAANAAW9321.3
    A reply falls below the community's threshold of quality. You may see it by logging in.
Re: Parsing a text file to get the location of the latest
by jonnyfolk (Vicar) on Nov 03, 2012 at 06:59 UTC
    Since all entries seem to be in time order, the simplest logic would surely be to split on the double new line, loop the resulting array and search for Approved, push 'Approved' block into a new array and extract the information you need from the final array entry. Simples!