Re: Help needed in perl (54 Views)
Reply
Trusted Contributor
Srikanth Arunachalam
Posts: 266
Registered: ‎05-22-2006
Message 1 of 9 (54 Views)
Accepted Solution

Help needed in perl

I need to process inbound feed file with name as XXX_DD_MM_YYYY_GnnnnVnn.DAT and split them based on country code.

Kindly help me with what I need to do to dynamically create a file in the script and based on country UK, I need to dynamically create XXX_UK_DD_MM_YYYY_GnnnnVnn.DAT. I have multi dated files present in my inbound feed area.

I can do this in shell as well, but I believe processing of large feed file is quicker in perl than shell, kindly correct me if I am wrong.
Please use plain text.
Trusted Contributor
Srikanth Arunachalam
Posts: 266
Registered: ‎05-22-2006
Message 2 of 9 (54 Views)

Re: Help needed in perl

An earlier response to above query will be much apprecialted.
Please use plain text.
Acclaimed Contributor
James R. Ferguson
Posts: 21,184
Registered: ‎07-06-2000
Message 3 of 9 (54 Views)

Re: Help needed in perl

Hi:

Sample input and sample, expected output go a long way to offering decent suggestions.

In your example, how would I know that the country code is "UK"?

Regards!

...JRF...
Please use plain text.
Trusted Contributor
Srikanth Arunachalam
Posts: 266
Registered: ‎05-22-2006
Message 4 of 9 (54 Views)

Re: Help needed in perl

It is based on the column position within each record. The country code seems to be available between position 11-13 on each record. Each record in my file XXX_DD_MM_YYYY_GnnnnVnn.DAT would read as
4000000001600XXXXXXXXXXX
If 600, then I would need to copy it to a file by name XXX_600_DD_MM_YYYY_GnnnnVnn.DAT.

Thanks,
Srikanth
Please use plain text.
Honored Contributor
Michael Steele_2
Posts: 4,934
Registered: ‎08-14-2002
Message 5 of 9 (54 Views)

Re: Help needed in perl

Hi

What do you have so far? Any open or close file statements? Any variable file names?
Support Fatherhood - Stop Family Law
Please use plain text.
Trusted Contributor
Srikanth Arunachalam
Posts: 266
Registered: ‎05-22-2006
Message 6 of 9 (54 Views)

Re: Help needed in perl

Hi,

Currently I have the following script.
I would like to create new tgtfile control file based on current file of datafile.

#!/usr/bin/perl
my ($datafile, $tmp, $i, $line, $columns, $x, $y);
my (@col, @dataline, @cell, %col);


$datafile = $ARGV[0]; # pick up data file name from command line
$targetfile = $ARGV[1];
$tgtfile = $ARGV[2];
$cntfile = $ARGV[3];

open (DATAFILE, "<$datafile") or die "Failed to open $datafile for input";

open(TGT1,">$targetfile") or die $!;

open(TGT2,">$tgtfile") or die $!;

while($line = )
{
chomp($line);
next unless($line =~ m/\S+/);

@array = split("",$line);

if(($array[11] == 2)&&($array[12] == 7))
{
$line = join("",@array);
print TGT1 $line ."\n";
$x++
}
else
{
$line = join("",@array);
print TGT2 $line ."\n";
$y++
}
}
printf ("%010d\n",$x);
printf ("%010d\n",$y);

close DATAFILE;
close TGT1;
close TGT2;

Please use plain text.
Honored Contributor
H.Merijn Brand (procura
Posts: 6,185
Registered: ‎10-13-1997
Message 7 of 9 (54 Views)

Re: Help needed in perl

>#!/usr/bin/perl

You miss these:

use strict;
use warnings;

>my ($datafile, $tmp, $i, $line, $columns, $x, $y);

declare the variables where you use and initialize them. Not as a bunch of unrelated variables at the top of your script.

>my (@col, @dataline, @cell, %col);

You don't use these. anywhere.

>
>$datafile = $ARGV[0]; # pick up data file name from command line
>$targetfile = $ARGV[1];
>$tgtfile = $ARGV[2];
>$cntfile = $ARGV[3];

my ($datafile, $targetfile, $tgtfile, $cntfilr) = @ARGV;

>open (DATAFILE, "<$datafile") or die "Failed to open $datafile for input";

open my $dfh, "<", $datafile or die "$datafile: $!";

>open(TGT1,">$targetfile") or die $!;

open my $tfh1, ">", $targetfile or die "$tgtfile: $!";

>open(TGT2,">$tgtfile") or die $!;

open my $tfh2, ">", $tgtfile or die "$tgtfile: $!";

>while($line = )
>{

while (<$dfh>) {

>chomp($line);

chomp;

>next unless($line =~ m/\S+/);

\S+ is stupid if a single \S is enough to get it pass

m/\S/ or next;

>@array = split("",$line);
>if(($array[11] == 2)&&($array[12] == 7))
>{

I /think you do NOT want to do it like that.

Assuming there is some structure in the lines, you either want to use substr ($_, 11, 2) or (probably better) some sort of

my ($x, $y, $code, ...) = unpack "A5 A6 A2 ...", $_;
if ($code == 27) {

see 'man perlpacktut' for some more in-depth explanation.

>$line = join("",@array);

Why reassemble the line while you never modified it?

>print TGT1 $line ."\n";

print $tfh1 $_;
$x++;
}

>$x++
>}
>else
>{
>$line = join("",@array);
>print TGT2 $line ."\n";
>$y++
>}
else {
print $tfh2 $_;
$y++;
}
}

>printf ("%010d\n",$x);
>printf ("%010d\n",$y);

printf "%010d\n%010d\n", $x, $y;

>close DATAFILE;
>close TGT1;
>close TGT2;

close $dfh or die "$datafile: $!";
close $tfh1 or die "$targetfile: $!";
close $tfh2 or die "$tgtfile: $!";

Enjoy, Have FUN! H.Merijn
Enjoy, Have FUN! H.Merijn
Please use plain text.
Acclaimed Contributor
James R. Ferguson
Posts: 21,184
Registered: ‎07-06-2000
Message 8 of 9 (54 Views)

Re: Help needed in perl

Hi:

If I understand correctly, I think this fits your needs:

# cat ./myassembly
#!/usr/bin/perl
use strict;
use warnings;
my $outfh;
my $count = 0;
while (<>) {
my ( $left, $right ) = $ARGV =~ m{(^..._)(.+)};
chomp;
my $match = substr( $_, 10, 3 ); #...zero-relative...
if ( $match eq '600' ) {
if ( $count <= 0 ) {
my $newname = $left . $match . '_' . $right;
open( $outfh, '>>', $newname )
or die "Can't open '$newname': $!\n";
$count++;
}
print $outfh "$_\n";
}
}
continue {
close $outfh if eof;
$count = 0;
}
1;

...You can pass multiple filenames on the command line for processing, too:

# ./myassembly XXX_DD_MM_YYYY_GnnnnVnn.DAT YYY_DD_MM_YYYY_GnnnnVnn.DAT ...

Regards!

...JRF...
Please use plain text.
Honored Contributor
Michael Steele_2
Posts: 4,934
Registered: ‎08-14-2002
Message 9 of 9 (54 Views)

Re: Help needed in perl

Don't forget to award points to these two, hell, they did just write your script for you.
Support Fatherhood - Stop Family Law
Please use plain text.
The opinions expressed above are the personal opinions of the authors, not of HP. By using this site, you accept the Terms of Use and Rules of Participation