Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7892[/thread]

Zahl im Text finden und bearbeiten

Leser: 2


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
EagleFox
 2006-04-13 18:44
#64926 #64926
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Ist wieder mal ne Anfängerfrage.

Ich habe in einer Datei einen Header, der verschiedene Informationen für die Daten in der Datei enthält.
z.B. steht dort:

# Number Of Points: 10000.0000

Dieser Header wird gelesen und in eine andere Datei geschrieben. Dabei sollen einige Werte verändert werden.
Wie kann ich aus dem Header diese Zahl (10000) mathematisch bearbeiten (z.B einfach - 200) und dann in den "neuen" Header einfügen?

Der Gedanke von mir war:
Header in Zeilen zerlegen,

Code: (dl )
1
2
3
if($entry =~ /^\s*?#/){
my $zeile(split(/\r?\n/,$entry))
{


Zeile mit "Points" suchen (kommt nur einmal im Header vor),

Code: (dl )
1
2
3
if($zeile =~ /Points/){
.....?
}


in der Zeile dann eine Zahl suchen (aber wie speicher ich dann die gefundene Zahl in eine Variable? So gibt der Ausdruck doch nur true oder false, oder?)

Code: (dl )
my $zahl =~ /[0-9]+/


mathematisch bearbeiten

Code: (dl )
my $Points = $zahl - 200;


und dann den Header scheiben, aber wie? ;-/
jemand
 2006-04-13 19:47
#64927 #64927
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
z.B.:
Code: (dl )
1
2
3
4
5
6
my $zahl;
if($zeile =~ /Points/){
$zeile =~ /(\d+)/;
$zahl = $1;
}
$zahl -= 200;


\d trifft alle zahlen, wie auch [0-9]
+ da es ja mehrere sind

$1 ist das was im RegExp in Klammern () steht
der Inhalt der 2. klammer wäre dann $2, geht aber nur bis $9
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
Dubu
 2006-04-14 03:44
#64928 #64928
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=jemand,13.04.2006, 17:47]geht aber nur bis $9[/quote]
Nö.
sid burn
 2006-04-14 03:58
#64929 #64929
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ist der Erste Teil immer komplett gleich? Also steht immer "# Number of Points: " vor deiner gesuchten Zeile? Wie ist das mit Leerzeichen? Mehrere oder immer genau ein Leerzeichen nach dem Doppelpunkt?

Ist die zeile nach der zahl immer sofort zu ende? Wenn das alles der Fall ist, würde ich das so schreiben.

Code: (dl )
1
2
$zeile =~ m/^# Number Of Points: (\d+(?:\.\d+)?)$/;
$zahl = $1;


Ein einfaches "\d+" reicht nicht, da alles nach dem Komma nicht erkannt wird. Diese Regex erkennt eine Zahl mit oder ohne Komma.



Wenn du den String direkt bearbeiten möchtest, und den neuen Wert sofort im String ändern möchtest, dann geht auch sowas:

Code: (dl )
1
2
3
$string = "# Number Of Points: 10000.0000";
$string =~ s/(?<=^# Number Of Points: )(\d+(?:\.\d+)?)$/$1-200/e;
print $string, "\n";
\n\n

<!--EDIT|sid burn|1145057443-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
jemand
 2006-04-14 04:07
#64930 #64930
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
Doch nicht nur bis $9? Ich bitte mein Fehlwissen zu entschuldigen, hatte echt gedacht es wäre $1 bis $9.

Es reicht hier sehr wohl, denn er wollte nur die Zahl vor dem Komma:
[quote=EagleFox,13.04.2006, 16:44]...dem Header diese Zahl (10000) mathematisch...[/quote]
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
sid burn
 2006-04-14 04:30
#64931 #64931
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=jemand,14.April.2006, 02:07]Doch nicht nur bis $9? Ich bitte mein Fehlwissen zu entschuldigen, hatte echt gedacht es wäre $1 bis $9.

Es reicht hier sehr wohl, denn er wollte nur die Zahl vor dem Komma:
[quote=EagleFox,13.04.2006, 16:44]...dem Header diese Zahl (10000) mathematisch...[/quote][/quote]
Daraus lese ich persönlich jetzt nicht 100%ig ab, das alles nach dem Komma verworfen werden soll.

Als Zahl steht da "10000.0000". Mathematisch gesehen ist das die Zahl "10000", egal ob ich jetzt die Nullen dahinter aufliste, oder noch weitere drei Tausend Nullen anhänge.

Nicht jeder Formuliert immer genau das was er wirklich möchte. ;)


Wenn er die Stellen nach dem Komma wirklich nicht haben möchte, dann kann er ja einfach das "(\d+)" nehmen, und den rest den ich dahinter geschrieben habe, einfach weg lassen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-04-15 02:24
#64932 #64932
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zu der $1 - $9-Sache ist perlvar sehr empfehlenswert...

@sid_burn: Du musst Deinen Punkt noch maskieren (also mit Backslash).

Lesenswert zu RegEx:

perlre
perlretut
perlrequick
perlreref
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2006-04-15 03:29
#64933 #64933
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=renee,15.April.2006, 00:24]@sid_burn: Du musst Deinen Punkt noch maskieren (also mit Backslash).

Lesenswert zu RegEx:
...[/quote]
Ups, stimmt.
Wie peinlich. :(

Hab es gleich mal geändert.

Wer es ernst meint mit Regex, dem kann ich wirklich nur das Buch Reguläre Ausdrücke empfehlen.

Ich fande das war wohl eines der Besten Bücher die ich gelesen habe, und das war jeden Cent Wert. Selten so ein gutes Qualitativ Hochwertiges Buch gelesen.\n\n

<!--EDIT|sid burn|1145057413-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Strat
 2006-04-15 12:33
#64934 #64934
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=jemand,14.04.2006, 02:07]Doch nicht nur bis $9? Ich bitte mein Fehlwissen zu entschuldigen, hatte echt gedacht es wäre $1 bis $9.[/quote]
nein, das geht schon weiter; ich habe vor einiger zeit auch mal behauptet, es ginge nicht weiter, habe mich aber geirrt (hatte da was von windows-batch-programmierung in die falsche schublade gesteckt)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
EagleFox
 2006-04-18 18:43
#64935 #64935
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Hallo Ihr lieben guten Leute,

vielen Dank für Eure Hilfe!
Bin leider erst gerade aus einem Kurzurlaub zurückgekommen, daher keine Meldung mehr von mir!

Also, ich werde mich gleich mal ranmachen und das alles ausprobieren.

@ sid burn:
Also die Zeile sieht wirklich immer gleich aus, bis auf die Zahl, und nach der Zahl ist die Zeile auch zuende.
Bei der Zahl 10000.0000 ist in diesem Falle wirklich nur alles vor dem Komma interessant. So wie "jemand" es gemutmaßt hat. (Entschuldigt, wenn ich da vielleicht etwas unklar war.)
Ich bastel jetzt erst mal damit rum, was Ihr mir so alles schönes geleehrt habt!
Danke erst mal!
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-04-13 18:44.