Guys,

Here I come with the code for the dynamic file update.
Please let me know your comments and concerns with this code.
Thanks for your support and comments.

#################################

#! c:/perl/bin/perl
use File::Copy;

my $file = shift;
my $old = $file;
my $new = "$file.tmp.$$";
my $bak = "$file.bak";

copy($old, $new) or die "can't copy the file:$!";
open(OLD, "< $old")         or die "can't open $old: $!";
open(NEW, ">> $new")         or die "can't open $new: $!";
print "new file ",$new,"\n\n";

$count=1000;

# Correct typos, preserving case
for($i=1;$i<=$count;$i++) {

 seek(OLD,0,0);
 while ( <OLD> ) {

  #Condition to match the Field ID and incremanet by 20.
  #<Field ID="23120">
  if ( s/(<Field.*")(\d+)">/ $1 . ( $2 + ($i*20) ) . '">' /e )
  {
   print "OLD:$2 \t NEW:", $2 + ($i*20), "\n";
  }

  #Condition to match the line and increament by 1.
  # <string ID="Name" Value="24G_L24_UnitsQualifier_2123" />
  if ( s/_L(\d{1,3})_/ '_L' . ( $1 + ($i*1) ) . '_' /e )
  {
   print "OLD:L$1 \t NEW:L", $1 + ($i*1), "\n";
  }

  #Condition to increment the final segment in the above string
  if ( s/(<string.*L\d+.*_)(\d+)"/ $1 . ( $2 + ($i*20) ) . '"' /e )
  {
   print "OLD:$2 \t NEW:", $2 + ($i*20), "\n";
  }

  print NEW $_ or die "can't write to $new: $!";

 }
 print NEW "\n";


}

close(OLD)                  or die "can't close $old: $!";
close(NEW)                  or die "can't close $new: $!";


rename($old, $bak)          or die "can't rename $old to $bak: $!";
rename($new, $old)          or die "can't rename $new to $old: $!";



#################################################

THANKS.



On 2/12/10, Robert Wohlfarth <rbwohlfa...@gmail.com> wrote:
>
> On Fri, Feb 12, 2010 at 3:32 AM, elavazhagan perl <
> elavazhagan.p...@gmail.com> wrote:
>
>> *ORIGINAL CONTENT:*
>> <Field ID="*20000*">
>>       <AttrSet ID="Core">
>>        <integer ID="ZoneId" Value="999" />
>>        <string ID="Name" Value="42_*L1*_Valid_Line_Indicator_*20000*" />
>>        <boolean ID="LinkedCoord" Value="false" />
>>        <integer ID="Type" Value="3" />
>>        <integer ID="x" Value="0" />
>>        <integer ID="y" Value="0" />
>>        <integer ID="w" Value="10" />
>>        <integer ID="h" Value="10" />
>>       </AttrSet>
>>     </Field>
>>
>> *DESIRED OUTPUT:*
>>
>>  <Field ID="*20980*">
>>       <AttrSet ID="Core">
>>        <integer ID="ZoneId" Value="999" />
>>        <string ID="Name" Value="42_*L1000*_Valid_Line_Indicator_*20980*"
>> />
>>        <boolean ID="LinkedCoord" Value="false" />
>>        <integer ID="Type" Value="3" />
>>        <integer ID="x" Value="0" />
>>        <integer ID="y" Value="0" />
>>        <integer ID="w" Value="10" />
>>        <integer ID="h" Value="10" />
>>       </AttrSet>
>>     </Field>
>>
>
> In summary, you want to...
>
>    1. Read an entire file into one string.
>    2. Using a regular expression, get the current value of "Field ID".
>    3. Loop from 2 to 1000...
>       1. Increment "Field ID" by 20.
>       2. Substitute the new "Field ID" for the old one, using regular
>       expressions.
>       3. Substitute the counter (Lxxxx) in the <string ID="Name"> field.
>       4. Write the entire block out to a new file.
>
> Is that accurate?
>
> --
> Robert Wohlfarth
>
>

Reply via email to