String splitten
Marko
- perl
0 Frank Schönmann0 Marko
0 Bogus0 Thomas Hofmann0 Jörg Wittemeier0 Marko
Hallo Leute,
ich habe ein wohl einfaches kleines Perl Problem, aber mir schwirrt jetzt schon so der Kopf, das ich mal die faule Tour wähle und Dumm frage, statt die Dokus zu wälzen, Sorry;-)
Das Problem:
Ein String der Form:
"Irgendeine Bezeichnung aus Zahlen und Buchstaben 1234,34 DM"
Soll in zwei Variablen gesplittet werden:
$Bezeichnung = "Irgendeine Bezeichnung aus Zahlen und Buchstaben"
$Preis = "1234,34"
Vielen Dank
Marko
hi!
Ein String der Form:
"Irgendeine Bezeichnung aus Zahlen und Buchstaben 1234,34 DM"
Soll in zwei Variablen gesplittet werden:
$Bezeichnung = "Irgendeine Bezeichnung aus Zahlen und Buchstaben"
$Preis = "1234,34"
Leider hast du uns kein Beispiel für die Bezeichnung genannt. Wenn in der Bezeichnung keine Leerzeichen vorkommen, funktioniert es folgendermaßen:
my ($Bezeichnung, $Preis) = split / /, $String, 2;
bye, Frank!
Leider hast du uns kein Beispiel für die Bezeichnung genannt. Wenn in der Bezeichnung keine Leerzeichen vorkommen, funktioniert es folgendermaßen:
my ($Bezeichnung, $Preis) = split / /, $String, 2;
Danke für die prompte Antwort, leider können aber auch Leerzeichen, Zahlen und sonst alles vorkommen, man müsste von hinten z.B. 345,00 DM absplitten, also DM-Leerstelle-Zahlenbetrag bis zur ersten Leerstelle. Aber wie formuliere ich da die verdammten regulären Ausdrücke ?
Gruss
MArko
Hallo Marko
leider können aber auch Leerzeichen, Zahlen und sonst alles vorkommen, man müsste von hinten z.B. 345,00 DM absplitten, also DM-Leerstelle-Zahlenbetrag bis zur ersten Leerstelle. Aber wie formuliere ich da die verdammten regulären Ausdrücke ?
Das folgende tut zumindest mal:
#! perl
$String = "Bezeichnung aus 2 Zahlen und 123 Buchstaben zu 1234,34 DM";
$String =~ /(.*)( \d*,\d\d DM)/;
$Bezeichnung = $1;
$Preis = $2;
print "Bezeichnung = $Bezeichnung\nPreis = $Preis";
Voraussetzung dabei ist, dass der Preis immer am Ende steht und immer mit DM endet (kann man evtl. noch etwas verfeinern, in dem man fuer DM auch Wildcards einsetzt, dann aber muss ein § ans Ende, damit klar ist, dass die letzten Zeichen des Strings gemeint sind)
viele Gruesse
Stefan Muenz
Hallo auch!
leider können aber auch Leerzeichen, Zahlen und sonst alles vorkommen, man müsste von hinten z.B. 345,00 DM absplitten, also DM-Leerstelle-Zahlenbetrag bis zur ersten Leerstelle. Aber wie formuliere ich da die verdammten regulären Ausdrücke ?
Das folgende tut zumindest mal:
#! perl
$String = "Bezeichnung aus 2 Zahlen und 123 Buchstaben zu 1234,34 DM";
$String =~ /(.*)( \d*,\d\d DM)/;
$Bezeichnung = $1;
$Preis = $2;
print "Bezeichnung = $Bezeichnung\nPreis = $Preis";Voraussetzung dabei ist, dass der Preis immer am Ende steht und immer mit DM endet (kann man evtl. noch etwas verfeinern, in dem man fuer DM auch Wildcards einsetzt, dann aber muss ein § ans Ende, damit klar ist, dass die letzten Zeichen des Strings gemeint sind)
Das mit der Voraussetzung stimmt so nicht! Wenn dieses Script auf einen String wie
"Bezeichnung aus 2 Zahlen und 123 Buchstaben zu 1234,34 DM und so weiter"
angesetzt wird, dann bekommen wir auch als Preis: "1234,34 DM". Ein enfaches "$" am Ende
der regular-expression würde dies dann ausschalten. Man könnte sich jetzt höchstens noch Gedanken machen, ob die Zahlwerte auch anders aussehen können ... ach ja, der Txt " DM" sollte ja weg fallen.
$String = "Bezeichnung aus 2 Zahlen und 123 Buchstaben zu 1.234,34 DM";
($Bezeichnung, $Preis) = ($String =~ /(.*)\s([\d.]+(?:,\d\d?)?) DM/);
print "Bezeichnung = $Bezeichnung\nPreis = $Preis";
Schade eigentlich, daß sowas immer zum Wochenende hin hier auftacht :(
ciao,
Jörk
Hye marko
"Irgendeine Bezeichnung aus Zahlen und Buchstaben 1234,34 DM"
Soll in zwei Variablen gesplittet werden:
anstatt dir hier jetzt genau aufzuschreiben wie es funktioniert, verweise ich dich wieder aufs waelzen von dokus. dabei wuerde ich dir aber
<../../tgck.htm#a1> speziell empfehlen.
mit dem index befehl und den dazugehoerigen muesstest du einfach abfragen ab welchem zeichen eine zahl steht. und ab diesem zeichen dann splitten.
sollte nicht so schwer sein.
cu
»
anstatt dir hier jetzt genau aufzuschreiben wie es funktioniert, verweise ich dich wieder aufs waelzen von dokus. dabei wuerde ich dir aber
<../../tgck.htm#a1> speziell empfehlen.
Hi Bogus,
danke, aber genau das hab ich natürlich schon gewälzt, es geht aber nicht, da ja auch schon die Bezeichnung eine Zahl enthalten kann, z.b. Peugeot 306
Gruss
MArko
»
anstatt dir hier jetzt genau aufzuschreiben wie es funktioniert, verweise ich dich wieder aufs waelzen von dokus. dabei wuerde ich dir aber
<../../tgck.htm#a1> speziell empfehlen.Hi Bogus,
danke, aber genau das hab ich natürlich schon gewälzt, es geht aber nicht, da ja auch schon die Bezeichnung eine Zahl enthalten kann, z.b. Peugeot 306
es geht aber doch! dann beginnst du eben von hinten mit dem aufloesen. da der betrag bzw. die zahl immer am ende steht, liest du von hinten so viele zeichen nach vor, bis nach den zahlen das erste mal ein leerzeichen kommt.
Hallo Leute,
ich habe ein wohl einfaches kleines Perl Problem, aber mir schwirrt jetzt schon so der Kopf, das ich mal die faule Tour wähle und Dumm frage, statt die Dokus zu wälzen, Sorry;-)
Das Problem:
Ein String der Form:
"Irgendeine Bezeichnung aus Zahlen und Buchstaben 1234,34 DM"
Soll in zwei Variablen gesplittet werden:
$Bezeichnung = "Irgendeine Bezeichnung aus Zahlen und Buchstaben"
$Preis = "1234,34"
»»
Vielen Dank
Marko
Hallo Marko,
Warum setzt du nicht einfach ein Trennzeichen vor den Betrag? z.B. "Irgendeine Bezeichnung aus Zahlen und Buchstaben #1234,34 DM"
Hallo Marko !
Versuch mal das:
#hier wird " DM" incl. Leerzeichen entfernt
$string=~s/ DM//g;
#hier wird die letzte Stelle mit einem Leerzeichen ermittelt
$anfang_betrag=rindex($string," ")+1;
#hier wird aus $string der Betrag gezogen
$betrag=substr($string,$anfang_betrag);
#hier wird der Rest ermittelt
$string=~s/ $betrag//g;
#hier wird wieder DM an den Betrag angefügt
$betrag="$betrag"." DM";
print "Content-type: text/html\n\n";
print "$string<br>\n";
print "$betrag\n";
gruß
jörg
Vielen Dank,
zwei praktikable Möglichkeiten habe ich nun. War aber wirklich nicht ganz trivial ;-)
Gruss
Marko