zwei mal pattern-match

zwei mal pattern-match

am 28.09.2006 07:28:47 von Scotter

hallo!

ich brauche "starthilfe" bei den folgenden
zwei problemstellungen:

1. am beginn einer zeile soll der text entfernt
werden, der sich zwischen den ersten zwei
vorkommenden ";" befindet: ";txtxtxtxt;"

2. innerhalb einer zeile soll der textteil
", nnnn" durch ";nnnn" ersetzt werden (nnnn = ziffen)

vielen dank

greets
alex
-/--\-

Re: zwei mal pattern-match

am 28.09.2006 09:40:07 von Frank Seitz

Alex Kainz wrote:

> ich brauche "starthilfe" bei den folgenden
> zwei problemstellungen:
>
> 1. am beginn einer zeile soll der text entfernt
> werden, der sich zwischen den ersten zwei
> vorkommenden ";" befindet: ";txtxtxtxt;"
>
> 2. innerhalb einer zeile soll der textteil
> ", nnnn" durch ";nnnn" ersetzt werden (nnnn = ziffen)

Hast Du bislang selbst irgendwelche Versuche unternommen,
das hinzubekommen? Ich finde, Du solltest mal anfangen,
Perl zu lernen, wenn Du ständig damit zu tun hast.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: zwei mal pattern-match

am 28.09.2006 10:11:42 von Mirco Wahab

Thus spoke Alex Kainz (on 2006-09-28 07:28):

> 1. am beginn einer zeile soll der text entfernt
> werden, der sich zwischen den ersten zwei
> vorkommenden ";" befindet: ";txtxtxtxt;"
>
> 2. innerhalb einer zeile soll der textteil
> ", nnnn" durch ";nnnn" ersetzt werden (nnnn = ziffen)

Frank hat imho recht, Du solltest bereits
einen Versuch, das zu lösen, unternommen
haben - (doch für Anfänger ist die konkrete
Fragestellung nicht trivial).

==> was passiert mit den ;xxx;, wenn das xxx entfernt
wurde, bleiben die ;; drin ?

Du solltest schrittweise rangehen, also z.B.

- Datei zeilenweise einlesen:

while( <$filehandle> ) {
...

- jede Zeile z.B. an den ';' zerlegen

my @fields = split /;/;

- jetzt das n'te Feld herausnehmen (von 0 beginnend, 1. löschen)

my @lessfields = @fields[0,2..$#fields];

- die Ersetzung von ', num' zu ';num' vorhehmen:

s/, (\d+)/;$1/g for @lessfields;

- die Zeile wieder zusammenbauen

print join ';', @lessfields;

Vielleicht kannst Du damit schon starten.


Viele Grüße

Mirco

Re: zwei mal pattern-match

am 28.09.2006 10:24:30 von Frank Seitz

Mirco Wahab wrote:
> Thus spoke Alex Kainz (on 2006-09-28 07:28):
>>
>>1. am beginn einer zeile soll der text entfernt
>>werden, der sich zwischen den ersten zwei
>>vorkommenden ";" befindet: ";txtxtxtxt;"
>>
>>2. innerhalb einer zeile soll der textteil
>>", nnnn" durch ";nnnn" ersetzt werden (nnnn = ziffen)
>
> Frank hat imho recht, Du solltest bereits
> einen Versuch, das zu lösen, unternommen
> haben - (doch für Anfänger ist die konkrete
> Fragestellung nicht trivial).

Doch, die ist trivial. Das sind zwei simple s///.
Warum Du das so kompliziert machst, leuchtet mir nicht ein.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: zwei mal pattern-match

am 28.09.2006 10:39:33 von Mirco Wahab

Thus spoke Frank Seitz (on 2006-09-28 10:24):

> Doch, die ist trivial. Das sind zwei simple s///.
> Warum Du das so kompliziert machst, leuchtet mir nicht ein.

Weil ich vermutet habe, dass es am Ende
*nur* mit split zu lösen sein wird:

split /;, / ... # oder so

und die Idee mit s/../.../ nur ein
Schritt auf dem Weg zum Verständnis
ist (ehrlich gesagt).

Viele Grüße

Mirco


PS. wenn er Anfänger ist, willst
Du ihn gleich ins Pattern-Matching
hineinstürzen?

Re: zwei mal pattern-match

am 28.09.2006 11:04:53 von Frank Seitz

Mirco Wahab wrote:
> Thus spoke Frank Seitz (on 2006-09-28 10:24):
>>
>>Doch, die ist trivial. Das sind zwei simple s///.
>>Warum Du das so kompliziert machst, leuchtet mir nicht ein.
>
> Weil ich vermutet habe, dass es am Ende
> *nur* mit split zu lösen sein wird:
>
> split /;, / ... # oder so
>
> und die Idee mit s/../.../ nur ein
> Schritt auf dem Weg zum Verständnis
> ist (ehrlich gesagt).

$str =~ s/;[^;]+;/;;/;

> PS. wenn er Anfänger ist, willst
> Du ihn gleich ins Pattern-Matching
> hineinstürzen?

Ach, er stellt hier schon seit Jahren immer solche Fragen.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: zwei mal pattern-match

am 28.09.2006 13:44:09 von hjp-usenet2

On 2006-09-28 08:39, Mirco Wahab wrote:
> PS. wenn er Anfänger ist, willst Du ihn gleich ins Pattern-Matching
> hineinstürzen?

Warum nicht? Ich halte einfache Ersetzungen in Strings für einfacher als
die Manipulation von Arrays.

hp


--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd

Re: zwei mal pattern-match

am 28.09.2006 14:37:13 von Scotter

"Frank Seitz" schrieb im Newsbeitrag
news:4o1cioFcg920U1@individual.net...
> Alex Kainz wrote:
>
> > ich brauche "starthilfe" bei den folgenden
> > zwei problemstellungen:
> >
> > 1. am beginn einer zeile soll der text entfernt
> > werden, der sich zwischen den ersten zwei
> > vorkommenden ";" befindet: ";txtxtxtxt;"
> >
> > 2. innerhalb einer zeile soll der textteil
> > ", nnnn" durch ";nnnn" ersetzt werden (nnnn = ziffen)
>
> Hast Du bislang selbst irgendwelche Versuche unternommen,
> das hinzubekommen? Ich finde, Du solltest mal anfangen,
> Perl zu lernen, wenn Du ständig damit zu tun hast.
>
> Grüße
> Frank
> --
> Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
> Anwendungen für Ihr Internet und Intranet
> Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: zwei mal pattern-match

am 28.09.2006 14:40:45 von Scotter

> Hast Du bislang selbst irgendwelche Versuche unternommen,
> das hinzubekommen? Ich finde, Du solltest mal anfangen,
> Perl zu lernen, wenn Du ständig damit zu tun hast.

natürlich habe ich, aber ich bin mit s/// daran gescheitert,
dass es mir nicht klar ist, wie ich den suchpattern auf den
zweiten ";" begrenze. meine versuche haben immer den letzten
";" in der zeile angenommen.

zum ", nnnn": ich denke, auch das lässt sich mit s/// lösen,
wobei ich denke, da muss dann noch ein $1 hinzu, aber daran
scheitere ich (noch) ....


greets
alex
-/--\-

Re: zwei mal pattern-match

am 28.09.2006 15:09:03 von Mirco Wahab

Thus spoke Alex Kainz (on 2006-09-28 14:40):

> natürlich habe ich, aber ich bin mit s/// daran gescheitert,
> dass es mir nicht klar ist, wie ich den suchpattern auf den
> zweiten ";" begrenze. meine versuche haben immer den letzten
> ";" in der zeile angenommen.

Bring doch mal ein Beispiel.

> zum ", nnnn": ich denke, auch das lässt sich mit s/// lösen,
> wobei ich denke, da muss dann noch ein $1 hinzu, aber daran
> scheitere ich (noch) ....

Ich habe die Vermutung, dass man gar nichts
dazu sagen kann, so lange man Deine Daten
nicht kennt.

Poste doch mal ein signifikantes Stück
der Daten, welche Du bearbeiten willst,
vielleicht sieht man dann eher, wie man
herangehen müsste. So 10 Zeilen vielleicht.

Viele Grüße

M.

Re: zwei mal pattern-match

am 28.09.2006 15:39:17 von Scotter

>
> Bring doch mal ein Beispiel.
>

so gelöst:
$line =~ s/, (\d\d\d\d)/;$1;/;

Re: zwei mal pattern-match

am 28.09.2006 18:44:30 von Mirco Wahab

Thus spoke Alex Kainz (on 2006-09-28 15:39):

>>
>> Bring doch mal ein Beispiel.
>>
>
> so gelöst:
> $line =~ s/, (\d\d\d\d)/;$1;/;

Prima, - aber um *welche* Daten zu bearbeiten?

Wie sieht so eine Datenzeile aus?

M.

Re: zwei mal pattern-match

am 29.09.2006 06:38:05 von Scotter

>
> Prima, - aber um *welche* Daten zu bearbeiten?
>
> Wie sieht so eine Datenzeile aus?
>

vorher: txtxtx\t txtxtx\t txtxtx, 5555\t txtxtx
nachher: txtxtx\t txtxtx\t txtxtx;5555;\t, txtxtx

ps: geht auch: $line =~ s/, (\d{4})/;$1;/;

greets
alex
-/--\-

Re: zwei mal pattern-match

am 29.09.2006 09:52:19 von Mirco Wahab

Thus spoke Alex Kainz (on 2006-09-29 06:38):

>> Wie sieht so eine Datenzeile aus?
>>
>
> vorher: txtxtx\t txtxtx\t txtxtx, 5555\t txtxtx
> nachher: txtxtx\t txtxtx\t txtxtx;5555;\t, txtxtx
>
> ps: geht auch: $line =~ s/, (\d{4})/;$1;/;

Aha, ich sehe. Was mich nur wundert, steht
*wirklich* "txtxtx\t ..." in Deiner Datei drin?

(Oder ist das bereits Deine 'Interpretation'
der Datenzeilen?) Was würede das denn bedeuten
(nur interessehalber)?

Viele Grüße

M.

Re: zwei mal pattern-match

am 29.09.2006 09:58:52 von Ferry Bolhar

Alex Kainz:

> natürlich habe ich, aber ich bin mit s/// daran gescheitert,
> dass es mir nicht klar ist, wie ich den suchpattern auf den
> zweiten ";" begrenze. meine versuche haben immer den letzten
> ";" in der zeile angenommen.

Das liegt daran, dass Reguläre Ausdrücke "greedy" sind - es
wird, wenn man nichts anderes angibt, immer soviel wie möglich
gematcht (und daher auch ersetzt).

Da ich nicht weiß, wie deine Daten genau aussehen, kann man
statt

/;(.+);/ # matcht vom ersten bis zum letzten ";" (einschließlich
# aller ";" dazwischen)

entweder

/;([^;]+);/ # matcht ein ";", dann alles ausser ";", dann wieder ";"
# das ist der Ansatz mit einer negierten Zeichenklasse

oder

/;(.+?);/ # matcht ein ";", dann "möglichst wenig" bis zum nächsten
# ";" - das ist der Ansatz mit einem "non-greedy quantifier"

Ich bevorzuge die erste Lösung, da sie auch mit allen Tools, die nur
eine einfache Suchmaschine eingebaut haben, funktioniert (zB. sed).
Der zweite Ansatz gehört zu den "extended regular expressions".

perldoc perlretut hätte dir das übrigens auch verraten...

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at