Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 144
  • Last Modified:

replace }else{ append to text file...?

I'm trying to read a text file, each line being a record with a unique name at the beginning, and comparing to a new input line. Based on whether the name of the record finds a match or not, either replace the matching line, otherwise append that line to the end of the file. Also to delete a line if indicated.

I've played with some code I found, but the results are either it duplicates the lines read in and appends them all, or it just writes the same (new) line out for every record.

I won't muck things up with the code I've started with, I want a fresh start, but basically it needs to look like:

file content example:
name=value|value|value|value|...continues....
monkey=something|anotherthing|anything|........
bear=problem|anything|manythings|duplicate|tree|.......
harvey=speaker|duplicate|something|........


$saveline = $ENV{QUERY_STRING}  # new line input
  open the existing file.
  read each line already there.
  compare 'name' value of $saveline to file records.
  if names match AND value='delete' kill this record.
    }elsif{
    names match AND value!='delete' replace the older record with the new one.
    }else{
    leave the older record as-is.
  }
  write all records back out to the file.
  close file.

So (using data above) if $saveline is:  
buick=old|blue|something|quite|carpet|........
it would append as a new record.

But if $saveline is:
bear=pink|orange|blue|green|red|......
it would overwrite the existing 'bear' line.

Or if $saveline is:
bear=delete|
this record is removed from the file.

Hope I'm making sense here, sorry for the weird thumbnail layout, but I'm in a hurry, I'm at work and have no reference material in front of me.

thanks!
0
nascar_3
Asked:
nascar_3
  • 4
  • 3
1 Solution
 
ozoCommented:
Does the order of the lines in the file matter?
0
 
nascar_3Author Commented:
No, there is nothing depending on the sort order.
0
 
ozoCommented:
$oldfile = "oldfilename";
$newfile = "tempfile.$$";
$saveline = $ENV{QUERY_STRING} || "bear=pink|orange|blue|green|red\n";
open O,"<$oldfile" or die "can't read $oldfile because $!";
open N,">$newfile" or die "can't write $newfile because $!";
chomp $saveline;
$saveline .= $/;
($name,$value) = (split/\|/,$saveline)[0,1];
if( $value eq "delete" ){ $saveline = '';
while( <O> ){
    $oldname=(split/\|/)[0];
    if( $oldname eq $name ){
     print N $saveline;
        $saveline = '';
    }else{
     print N;
    }
}
print N $saveline;
close N or die "Can't close $!";
close O;
rename $newfile,$oldfile or die "Can't rename $!";

0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
ozoCommented:
#sorry, that should have been
($name,$value) = (split/[=|]/,$saveline)[0,1];
0
 
nascar_3Author Commented:
thanks ozo-

I'll play with this later when I'm home, but a couple of questions:

Could you explain a little bit about what these 2 lines are doing?
chomp $saveline;
$saveline .= $/;

Why the []and | in the split function?
I would have thought just (split/=/,$saveline)
($name,$value) = (split/[=|]/,$saveline)[0,1];


0
 
ozoCommented:
chomp $saveline;
$saveline .= $/;
#I wanted to make sure $saveline ended with one input  record separator
split/=/,$saveline would be fine, except that you then have to compare $value eq "delete|\n"
0
 
nascar_3Author Commented:
Thanks ozo!

I pretty much just plugged it in and it worked!
I needed to add : $saveline=~ s/%20/ /g;
because my form was passing the spaces as '%20', but then it performed just as I wanted it to.

Much Appreciated!
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now