On Nov 15, 2012, at 7:30 PM, Mohan L wrote:

> Dear All,
> 
> The below is my input data:
> 
> $ cat demo.txt
> 159350,PP02,Backup,0,Done
> 159349,B02_bkp,Backup,0,Done
> 159347,B02_bkp,Backup,0,Done
> 159346,B02_bkp,Backup,0,Done
> 159345,B02_bkp,Backup,0,Not
> 159344,02_bkp,Backup,0,Done
> 
> I am using Text::CSV_XS to read the above comma separated file. Here is the
> code I am using the above file line by line.
> 
> #!/usr/bin/perl
> use strict;
> use warnings;
> use Data::Dumper;
> use Text::CSV_XS;
> 
> 
> my $file="/data/demo.txt";
> if(defined $ARGV[0])
> {
>    $file=$ARGV[0];
> }
> 
> my $csv = Text::CSV_XS->new({binary => 1,sep_char => ','}) or die "Cannot
> use CSV: ".Text::CSV->error_diag ();
> open(my $data, '<', $file) or die "Could not open '$file'\n";
> while (my $line = <$data>)
> {
>    if ($csv->parse($line))
>    {
>        my @row = $csv->fields();
>        print "$row\n";
>        // compare and replace string name to id.
>    }
>    else
>    {
>        warn "Line could not be parsed: $line\n";
>    }
> }
> 
> I have two hash reference like :
> 
> $VAR1 = \{
>            '1' => {
>                     'name' => 'Backup',
>                     'id' => '1'
>                   },
>            '2' => {
>                     'name' => 'Catalog',
>                     'id' => '2'
>                   }
>          };
> 
> 
> $VAR2 = \{
>            '1' => {
>                     'name' => 'Done',
>                     'id' => '1'
>                   },
>            '2' => {
>                     'name' => 'Not',
>                     'id' => '2'
>                   }
>          };
> 
> 
> 
> I want to compare $row[2] and $row[4] with the above hash and want to
> replace string name to respective id. for example:
> 
> 
> 159350,PP02,1,0,1
> 159349,B02_bkp,1,0,1
> 159347,B02_bkp,1,0,1
> 159346,B02_bkp,1,0,1
> 159345,B02_bkp,1,0,2
> 159344,02_bkp,1,0,1

The first thing to do is create a hash that has the replacements you want to 
apply. Assuming that you want to apply the same replacements to columns 3 and 
5, the hash would look like this:

my %replace = (
  Backup => 1,
  Catalog => 2,
  Done => 1,
  Not => 2,
);

You can get that from your two hashes by suitable extractions.

Then you can split your input lines on commas and apply the following operation 
to columns 3 and 5. For example, for column 3:

  if( exists $replace{$row[2]} ) {
    $row[2] = $replace{$row[2];
  }

If your replacements are different for the two columns, then you will have to 
use two hashes.

You can shorten the above to:

  $row[2] = exists $replace{$row[2]} ? $replace{$row[2]} : $row[2];

or, for later Perls:

  $row[2] = $replace{$row[2]} // $row[2];



--
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