Vinnaren i pepparkakshustävlingen!
2007-10-05, 07:53
  #1
Medlem
Jag har fått en ny arbetsuppgift på jobbet, de vill att jag ska ändra på värden och toleranser i textfiler som är cirka 45 000 rader styck.
Så jag tänkye att PERL borde fungera bra till detta, problemet är att jag inte kan PERL.
Jag har lyckats läsa in och skriva till filen men inte riktigt fått själva "Search and replace" argumentet att fungera som det ska.
Jag tänkte försöka använda mig av operanden s///g för att med hjälp av regular expressions söka igenom hela dokumentet och matcha samt byta ut de toleranser jag är intresserad av.

PROBLEM:
Byt ut denna rad
helt ointressant text som ska va kvar VALUE='100' LOTOL=83 HITOL=126
mot
helt ointressant text som ska va kvar VALUE='100' LOTOL=90 HITOL=110

Jag vill alltså bara byta ut värdena som står efter LOTOL= och HITOL= till 90% respektive 110% av talet efter VALUE='

Texten före VALUE och själva värdena varierar över hela textfilen men jag vill alltså alltid ändra värdet på toleranserna till 90% rspektive 110% av VALUE.
Jag vore grymt tacksam för hjälp!
Citera
2007-10-05, 18:57
  #2
Medlem
En snabbvariant, men du förstår säkert principen.

Kod:
my @lista = ("helt ointressant text som ska va kvar VALUE='100' LOTOL=83 HITOL=126");

my $lotolReplace = 90;
my $hitolReplace = 110;

foreach (@lista) {
	if (/.*VALUE=.*LOTOL=(.*)HITOL=(.*)/) {
		$_ =~ s/$1/$lotolReplace /;
		$_ =~ s/$2/$hitolReplace /;
		@lista[0] = $_;
	}
}

print "@lista \n";

Antagligen är det inte en array du vill loopa, utan en filpekare att läsa från och en annan att skriva till, men det är ganska trivialt, googla bara på perl open file
Citera
2007-10-09, 21:31
  #3
Medlem
Man börjar med att göra backup, sen...

Kod:
use strict;   # Always strict!
use warnings; # Always warnings!

# Name of the file to edit
my $in_file_name  = 'test.txt';

# Edited version is written to seperate file, with prefix edited_
my $out_file_name = 'edited_' . $in_file_name;

# Variable to keep track of the number of changes made
my $edited;

# Open file for reading
open my $FH_IN, '<', $in_file_name or die "Failed to open file : $!";

# Open file for writing
open my $FH_OUT, '>', $out_file_name or die "Failed to open file : $!";

# Define regular expression
my $regex = q{
    (.*)            # Everything on the row up to string VALUE, store in $1
    VALUE=\'        # VALUE='
    (\d+)           # One or more digits, store in $2
    \'              # ' 
    \s+             # one or more spaces
    LOTOL=          # LOTOL=
    (\d+)           # One or more digits, store in $3
    \s+             # One or more spaces  
    HITOL=          # HITOL=
    (\d+)           # One or more digits, store in $4
    (.*)            # Everything afterwards, store in $5
};

while(<$FH_IN>) {
    if(/$regex/gx) {
        print $FH_OUT $1 . "VALUE='" . $2 . "' LOTOL=" . ($2 * 0.9) . " HITOL=" . ($2 * 1.1) . $5 . "\n";
        $edited++;
    }
}

close $FH_OUT;

print "Edited $edited rows\n";

Kört på test.txt
anything anything anything anything VALUE='110' LOTOL=83 HITOL=126
some other text some other text VALUE='10' LOTOL=83 HITOL=126
head head head VALUE='101' LOTOL=11 HITOL=126 tail tail tail tail


skapar edited_test.txt
anything anything anything anything VALUE='110' LOTOL=99 HITOL=121
some other text some other text VALUE='10' LOTOL=9 HITOL=11
head head head VALUE='101' LOTOL=90.9 HITOL=111.1 tail tail tail tail


En förutsättning att ovan script fungerar är att en och samma VALUE='10' LOTOL=83 HITOL=126 entry inte "spänner" över multipla rader.

Testa och modifiera vid behov.
Citera
2007-10-10, 10:09
  #4
Medlem
Tack så mycket för svaren!
Jag hade faktiskt fått det att fungera halvbra men med eran hjälp har jag kunnat få till det riktigt bra!!
Tack!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback