On Fri, 12 Jul 2013 17:14:42 +0530
Agnello George <agnello.dso...@gmail.com> wrote:

> i have raw data that is like this in a flat file .
> 
> start
> name:agnello
> dob:2 april
> address:123 street
> end
> start
> name:babit
> dob:13 april
> address:3 street
> end
> start
> name:ganesh
> dob:1 april
> address:23 street
> end
> 
> 
> i need to get the data in the following format
> 
> name:agnello, dob:23 april ,address:123 street
> name:babit,dob:13 april,address:3 street
> name:ganesh,dob:1 april,address:23 street
> 
> i came up with this , is there a better way to do this :

I love record with a definite record terminator. Try:

#!/usr/bin/env perl

use strict;
use warnings;

# --------------------------------------

use charnames qw( :full :short   );
use English   qw( -no_match_vars );  # Avoids regex performance penalty

# --------------------------------------
sub read_record {
  my $record_fh = shift @_;

  # all records are from "start\n" to "end\n"
  local $INPUT_RECORD_SEPARATOR = "end\n";
  my $record = <$record_fh>;

  # $record undef at end of file
  if( defined $record ){

    # removes "end\n"
    chomp $record;

    # removes "start\n"
    $record =~ s{ \A start \s* }{}msx;
  }

  return $record;
}

# --------------------------------------
while( my $record = read_record( *DATA )){

  # remove trailing "\n"
  chomp $record;

  # replace field separators with commas
  $record =~ s{ \n+ }{,}gmsx;

  # display the record
  print "$record\n";
}



__DATA__
start
name:agnello
dob:2 april
address:123 street
end
start
name:babit
dob:13 april
address:3 street
end
start
name:ganesh
dob:1 april
address:23 street
end


-- 
Don't stop where the ink does.
        Shawn

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to