Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

parsing a perl string 2

Status
Not open for further replies.

jcarrott

Programmer
May 28, 2009
130
0
0
US
I am trying to read an input line and if the first field is H and the second field is 0000, then read the tenth field (which is 1533864 with 4 leading spaces). I need to check the first digit; if it is a 1 then change field[1] from 0000 to 0120, if it is 7 then change field[1] from 0000 to 0710, and if it is 8 then change field[1] from 0000 to 0800.

The program drops me into the inner loop for 1 and then again for 8 and the value of field[1] is never changed.

Can somebody please point out what I did wrong.

My input data is:
H,0000, 514659,GHXPCCONNECT810,45066599,,,,,,1533864,,,,,,,,20090529,,,,622.60
D,0000, 514659,GHXPCCONNECT810,45066599,,1,,,,1533864,,,,,,,,,,,,,,,,,,,,,,,,,

This 2 lines of data.

The program is:

foreach $line (<MyInFile>)
{
@field = split(/\,/, $line);
@numb = $field[10];
print $numb[0];

if ($field[0] == "H")
{
if ($field[1] == "0000")
{
if ($numb[0] =~ m/1/) # PO number starts with a 1
{
$field[1] = "0120";
print MyInFile $line;
}
if ($numb[0] =~ m/7/) # PO number starts with a 7
{
$field[1] = "0710";
print MyInFile $line;
}
if ($numb[0] =~ m/8/) # PO number starts with a 8
{
$field[1] = "0800";
print MyInFile $line;
}
}
}
}


 
First, you're trying to print to your INPUT file.
You need to create an OUTPUT file where you do your printing.

Second, you're updating $field[1], but not regenerating $line (via 'join').
 
Brigmar, thanks I do not normally work in Perl. Can I open the file as input and output? Or do I need a new output, then rename or copy it to the name of the input file?

I will do some checking into the "join".
 
Hi jcarrot,

Here is your example:

Given is this file
jcarrot_in.txt
Code:
H,0000,   514659,GHXPCCONNECT810,45066599,,,,,,1533864,,,,,,,,20090529,,,,622.60
D,0000,   514659,GHXPCCONNECT810,45066599,,1,,,,1533864,,,,,,,,,,,,,,,,,,,,,,,,, 
H,0000,   514659,GHXPCCONNECT810,45066599,,,,,,78910,,,,,,,,20090529,,,,622.60
H,0000,   514659,GHXPCCONNECT810,45066599,,,,,,89123,,,,,,,,20090529,,,,622.60
This is your corrected Perl-script
jcarrot.pl
Code:
[COLOR=#804040][b]use strict[/b][/color];

[COLOR=#804040][b]open[/b][/color]([COLOR=#008080]MyInFile[/color], [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]jcarrot_in.txt[/color][COLOR=#ff00ff]"[/color]) 
[COLOR=#804040][b]or[/b][/color] [COLOR=#804040][b]die[/b][/color] [COLOR=#ff00ff]'[/color][COLOR=#ff00ff]Could not open file for reading[/color][COLOR=#ff00ff]'[/color];

[COLOR=#804040][b]open[/b][/color]([COLOR=#008080]MyOutFile[/color], [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]>jcarrot_out.txt[/color][COLOR=#ff00ff]"[/color]) 
[COLOR=#804040][b]or[/b][/color] [COLOR=#804040][b]die[/b][/color] [COLOR=#ff00ff]'[/color][COLOR=#ff00ff]Could not open file for writing[/color][COLOR=#ff00ff]'[/color];

[COLOR=#804040][b]while[/b][/color] ([COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$line[/color]=[COLOR=#008080]<MyInFile>[/color]){
  [COLOR=#804040][b]chomp[/b][/color]([COLOR=#008080]$line[/color]);
  [COLOR=#0000ff]#print "\$line='$line'\n";[/color]
  [COLOR=#804040][b]my[/b][/color] [COLOR=#008080]@field[/color] = [COLOR=#804040][b]split[/b][/color]([COLOR=#804040][b]/[/b][/color][COLOR=#ff00ff],[/color][COLOR=#804040][b]/[/b][/color], [COLOR=#008080]$line[/color]);
  [COLOR=#0000ff]#print "\@field = @field\n";[/color]
  [COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$numb[/color] = [COLOR=#804040][b]substr[/b][/color]([COLOR=#008080]$field[/color][[COLOR=#ff00ff]10[/color]],[COLOR=#ff00ff]0[/color],[COLOR=#ff00ff]1[/color]); [COLOR=#0000ff]# first digit of number [/color]

  [COLOR=#804040][b]if[/b][/color] (([COLOR=#008080]$field[/color][[COLOR=#ff00ff]0[/color]] [COLOR=#804040][b]eq[/b][/color] [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]H[/color][COLOR=#ff00ff]"[/color])&&([COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] == [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0000[/color][COLOR=#ff00ff]"[/color])){    
    [COLOR=#804040][b]if[/b][/color] ([COLOR=#008080]$numb[/color] == [COLOR=#ff00ff]1[/color]) {
      [COLOR=#0000ff]# PO number starts with a 1[/color]
      [COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0120[/color][COLOR=#ff00ff]"[/color];
    }
    [COLOR=#804040][b]elsif[/b][/color] ([COLOR=#008080]$numb[/color] == [COLOR=#ff00ff]7[/color]) {
      [COLOR=#0000ff]# PO number starts with a 7[/color]
      [COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0710[/color][COLOR=#ff00ff]"[/color];
    }         
    [COLOR=#804040][b]elsif[/b][/color] ([COLOR=#008080]$numb[/color] = [COLOR=#ff00ff]8[/color])   {
      [COLOR=#0000ff]# PO number starts with a 8 [/color]
      [COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0800[/color][COLOR=#ff00ff]"[/color];
    }    
  }
  [COLOR=#0000ff]#print "\@field = @field\n";[/color]
  [COLOR=#0000ff]# create new line[/color]
  [COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$newline[/color] = [COLOR=#804040][b]join[/b][/color]([COLOR=#ff00ff]'[/color][COLOR=#ff00ff],[/color][COLOR=#ff00ff]'[/color], [COLOR=#008080]@field[/color]);
  [COLOR=#0000ff]#print "\$newline='$newline'\n";[/color]
  [COLOR=#804040][b]print[/b][/color] [COLOR=#008080]MyOutFile[/color] [COLOR=#ff00ff]"[/color][COLOR=#008080]$newline[/color][COLOR=#6a5acd]\n[/color][COLOR=#ff00ff]"[/color];
}
After running the above script
Code:
C:\Users\Roman\Work>perl jcarrot.pl
you get this file
jcarrot_out.txt
Code:
H,0120,   514659,GHXPCCONNECT810,45066599,,,,,,1533864,,,,,,,,20090529,,,,622.60
D,0000,   514659,GHXPCCONNECT810,45066599,,1,,,,1533864,,,,,,,,,,,,,,,,,,,,,,,,, 
H,0710,   514659,GHXPCCONNECT810,45066599,,,,,,78910,,,,,,,,20090529,,,,622.60
H,0800,   514659,GHXPCCONNECT810,45066599,,,,,,89123,,,,,,,,20090529,,,,622.60
I hope it helps you a little bit.

Roman
 
mikron has coded the solution (including tidying up the logic and using substr() instead of m//).

My only alteration to his code would be to treat the values as strings and use the 'eq' comparator as opposed to '==', but for our trivial example, it makes no difference.

Whilst it is possible to do 'in-place' editing of a file, it is usually more concise to have an input file and an output file.
 
Pleasee start by saying I thanked both of you for the great help.

I had been working on the code using the tips from brigmar. I then changed some of my code using the solution from mikrom.

This is my new code.

open(IN, "D:\\EDI\\810\\ma540csv") or die 'Could not open file for reading';

open(OUT, ">D:\\EDI\\810\\ma540csv.txt") or die 'Could not open file for writing';


foreach $line (<IN>)
{
@field = split(/\,/, $line);
$numb = substr($field[10],0,1); # first digit of number

if (($field[0] eq "H")&&($field[1] == "0000"))
{
if ($numb == 1) # PO number starts with a 1
{
$line =~ s/0000/0120/;
print OUT $line;
}
elsif ($numb == 7) # PO number starts with a 7
{
$line =~ s/0000/0710/;
print OUT $line;
}
elsif ($numb == 8) # PO number starts with a 8
{
$line =~ s/0000/0800/;
print OUT $line;
}
}
else
{
print OUT $line;
}
}
close(IN);
close(OUT);

unlink('D:\EDI\810\ma540csv');

use File::Copy;

$oldfile = 'D:\EDI\810\ma540csv';
$newfile = 'D:\EDI\810\ma540csv.txt';

copy ($newfile, $oldfile) or die "File cannot be copied: $!";

I have to get the new file (ma540csv.txt) copied to the old name (ma540csv). The unlink works to delete the old file, but the copy did not work?

Do you have any ideas?
 
To execute system command like delete or copy, you can use the function system().
Here is my previous example I improved
Code:
[COLOR=#804040][b]use strict[/b][/color];
[COLOR=#804040][b]use warnings[/b][/color];

[COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$oldfile[/color] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]jcarrot_in.txt[/color][COLOR=#ff00ff]"[/color];
[COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$newfile[/color] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]jcarrot_out.txt[/color][COLOR=#ff00ff]"[/color];

[COLOR=#804040][b]open[/b][/color]([COLOR=#008080]MyInFile[/color], [COLOR=#ff00ff]"[/color][COLOR=#008080]$oldfile[/color][COLOR=#ff00ff]"[/color]) 
[COLOR=#804040][b]or[/b][/color] [COLOR=#804040][b]die[/b][/color] [COLOR=#ff00ff]'[/color][COLOR=#ff00ff]Could not open file for reading[/color][COLOR=#ff00ff]'[/color];

[COLOR=#804040][b]open[/b][/color]([COLOR=#008080]MyOutFile[/color], [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]>[/color][COLOR=#008080]$newfile[/color][COLOR=#ff00ff]"[/color]) 
[COLOR=#804040][b]or[/b][/color] [COLOR=#804040][b]die[/b][/color] [COLOR=#ff00ff]'[/color][COLOR=#ff00ff]Could not open file for writing[/color][COLOR=#ff00ff]'[/color];

[COLOR=#804040][b]while[/b][/color] ([COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$line[/color]=[COLOR=#008080]<MyInFile>[/color]){
  [COLOR=#804040][b]chomp[/b][/color]([COLOR=#008080]$line[/color]);
  [COLOR=#0000ff]#print "\$line='$line'\n";[/color]
  [COLOR=#804040][b]my[/b][/color] [COLOR=#008080]@field[/color] = [COLOR=#804040][b]split[/b][/color]([COLOR=#804040][b]/[/b][/color][COLOR=#ff00ff],[/color][COLOR=#804040][b]/[/b][/color], [COLOR=#008080]$line[/color]);
  [COLOR=#0000ff]#print "\@field = @field\n";[/color]
  [COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$numb[/color] = [COLOR=#804040][b]substr[/b][/color]([COLOR=#008080]$field[/color][[COLOR=#ff00ff]10[/color]],[COLOR=#ff00ff]0[/color],[COLOR=#ff00ff]1[/color]); [COLOR=#0000ff]# first digit of number [/color]

  [COLOR=#804040][b]if[/b][/color] (([COLOR=#008080]$field[/color][[COLOR=#ff00ff]0[/color]] [COLOR=#804040][b]eq[/b][/color] [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]H[/color][COLOR=#ff00ff]"[/color])&&([COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] == [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0000[/color][COLOR=#ff00ff]"[/color])){    
    [COLOR=#804040][b]if[/b][/color] ([COLOR=#008080]$numb[/color] == [COLOR=#ff00ff]1[/color]) {
      [COLOR=#0000ff]# PO number starts with a 1[/color]
      [COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0120[/color][COLOR=#ff00ff]"[/color];
    }
    [COLOR=#804040][b]elsif[/b][/color] ([COLOR=#008080]$numb[/color] == [COLOR=#ff00ff]7[/color]) {
      [COLOR=#0000ff]# PO number starts with a 7[/color]
      [COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0710[/color][COLOR=#ff00ff]"[/color];
    }         
    [COLOR=#804040][b]elsif[/b][/color] ([COLOR=#008080]$numb[/color] == [COLOR=#ff00ff]8[/color])  {
      [COLOR=#0000ff]# PO number starts with a 8 [/color]
      [COLOR=#008080]$field[/color][[COLOR=#ff00ff]1[/color]] = [COLOR=#ff00ff]"[/color][COLOR=#ff00ff]0800[/color][COLOR=#ff00ff]"[/color];
    }    
  }
  [COLOR=#0000ff]#print "\@field = @field\n";[/color]
  [COLOR=#0000ff]# create new line[/color]
  [COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$newline[/color] = [COLOR=#804040][b]join[/b][/color]([COLOR=#ff00ff]'[/color][COLOR=#ff00ff],[/color][COLOR=#ff00ff]'[/color], [COLOR=#008080]@field[/color]);
  [COLOR=#0000ff]#print "\$newline='$newline'\n";[/color]
  [COLOR=#804040][b]print[/b][/color] [COLOR=#008080]MyOutFile[/color] [COLOR=#ff00ff]"[/color][COLOR=#008080]$newline[/color][COLOR=#6a5acd]\n[/color][COLOR=#ff00ff]"[/color];
}
[COLOR=#0000ff]# close files[/color]
[COLOR=#804040][b]close[/b][/color]([COLOR=#008080]MyInFile[/color]);
[COLOR=#804040][b]close[/b][/color]([COLOR=#008080]MyOutFile[/color]);

[COLOR=#0000ff]# delete oldfile[/color]
[COLOR=#804040][b]my[/b][/color] [COLOR=#008080]$rc[/color]=[COLOR=#804040][b]system[/b][/color]([COLOR=#ff00ff]"[/color][COLOR=#ff00ff]del [/color][COLOR=#008080]$oldfile[/color][COLOR=#ff00ff]"[/color]);
[COLOR=#0000ff]# copy newfile to oldfile[/color]
[COLOR=#804040][b]if[/b][/color] ([COLOR=#008080]$rc[/color]==[COLOR=#ff00ff]0[/color]) {
  [COLOR=#008080]$rc[/color]=[COLOR=#804040][b]system[/b][/color]([COLOR=#ff00ff]"[/color][COLOR=#ff00ff]copy [/color][COLOR=#008080]$newfile[/color][COLOR=#ff00ff] [/color][COLOR=#008080]$oldfile[/color][COLOR=#ff00ff]"[/color]);
}
[COLOR=#0000ff]# delete newfile so only oldfile remains[/color]
[COLOR=#008080]$rc[/color]=[COLOR=#804040][b]system[/b][/color]([COLOR=#ff00ff]"[/color][COLOR=#ff00ff]del [/color][COLOR=#008080]$newfile[/color][COLOR=#ff00ff]"[/color]);
 
jcarrott,

And don't forget to use
Code:
use strict;
use warnings;
It's very useful, e.g. in my 1.example I had this error at
Code:
...
elsif ([COLOR=red]$numb = 8[/color]) {      
...
}
But after I used
Code:
use warnings;
I got the warning:
Found = in conditional, should be == at jcarrot.pl line 29. and so I could correct the above error in 2.example to
Code:
...
elsif ([COLOR=green]$numb == 8[/color]) {      
...
}
 
Thank you very much this works great.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top