Aktuelle SeiteWähle Forum / Perl / Allgemeines zu Perl / Muster erkennen

Muster erkennen


Bild von krait86

By krait86 - Posted on 22 Februar 2010

Hallo liebes Perl-Forum!

ich bin ein ziemlicher Anfänger in Perl und habe eine Textdatei, die eine Reihe von Zeilen mit folgendem Inhalt aufweist:

Vorname_Nachname@12345@Köln@01/01/10

Am Anfang steht der Vorname dann, getrennt durch einen Unterstrich, der Nachname dann ein @ gefolgt von einer ID dann ein @ gefolgt von einem Städtenamen dann ein @ gefolgt von einem Datum mit / getrennt.

Nun kann es sein, dass bestimmte Zeilen eben nicht dem aufgeführten Muster entsprechen und daher aussortiert werden sollen. Das kann man wohl über das Pattern Matching in Perl realisieren, weiß allerdings trotz lesens zahlreicher Tutorials nicht wie ich das nun umsetzen soll :/

Finde die PatternMatching syntax einfach extrem kompliziert :(

Kann mir jemand aushelfen?

Vielen Dank und Viele Grüße
Bernd

Trackback URL für diesen Beitrag:

http://community.perl.de/trackback/28
0
Eigene Bewertung: Keine

Erklär' doch bitte mal abstrakt (d.h. ohne RegEx-Syntax), wie eine Zeile beschaffen sein soll, um aussortiert zu werden.

Wenn eine "gute" Zeile so aussieht:

Vorname_Nachname@12345@Köln@01/01/10

könnte ein Pattern so aussehen:

if ($zeile !~ m~^\w+_\w+\@\d+\@\w+\@\d\d/\d\d/\d\d$~) {
next;
}

Fragen:
Was ist bei Namen wie Paul Gustav Mustermann?
Was ist bei Datumsangaben mit weniger als 2 Stellen?
Was ist mit Stadtnamen, die Leerzeichen oder Bindestriche enthalten?
...

Aber es könnte ein Ansatz sein.

Ein besserer Ansatz könnte es sein, die Zeile bei den Klammeraffen zu trennen (perldoc -f split) und die einzelnen Teile zu untersuchen.

hallo zusammen,

habe auf Perl-community.de ein crosspost gemacht um mehr Leute zu erreichen. Hoffe das nimmt mir keiner übel :)
http://www.perl-community.de/bat/poard/thread/14713?p=1#ms_133513


Was ist bei Namen wie Paul Gustav Mustermann?
Das gibt es nicht bzw soll es nicht geben, die Informationen stammen aus einer Datenbank und dort sind Namen immer nach dem Schema Vorname_Nachname hinterlegt.

Was ist bei Datumsangaben mit weniger als 2 Stellen?
Gibt es ebenfalls nicht, das Datum kommt ebenfalls immer in diesem Muster.

Was ist mit Stadtnamen, die Leerzeichen oder Bindestriche enthalten?
Bei den Städtenamen handelt es sich um Städtenamen einzelner Niederlassungen, und die Städte die es gibt haben keine Leerzeichen etc.

Trotzdem kann es vorkommen, ich weiß auch nicht warum, dass Datensätze fehlerhaft sind.

Ein Beispiel eines Fehlerhaften Datensatzes:

müller@^1234@Kln@10/10/01

dieser soll aussortiert werden da:
-Nur Nachname vorhanden, das Muster Vorname_Nachname nicht erfüllt.
-ID besteht nicht nur aus Zahlen
-Stadt falsch (dies kann aber wohl kaum behoben werden, hier reicht eine Überprüfung ob nur das Alphabet vorhanden ist glaub das geht mit [A-Z] bei regex)

Schonmal großes Danke für die Hilfe, momentan bin ich allerdings wieder mit anderen Dingen beschäftigen sodass diese Aufgabe bis auf nächste Woche verschoben werden muss. Ich werde deinen Patternansatz aber mal durcharbeiten.

Also, ich setzte RegEx nur dann ein, wenn es nicht anders geht und arbeite sonst lieber mit split(), substr(), index() usw. Daher mein Vorschlag:
#!/usr/bin/perl
use warnings;
use strict;
my $a = 'Vorname_Nachname@12345@Köln@01/01/10';
if (checkString($a)) {
print "Wrong: '$a'\n";
}
$a = 'müller@^1234@Kln@10/10/01';
if (checkString($a)) {
print "Wrong: '$a'\n";
}
sub checkString
{
my $f = 0;
my $a = shift;
my @b = split("@", $a);
if ($#b != 3) {
print "Wrong number of '\@' in '$a'.\n";
$f++;
}
my @c = split("_", $b[0]);
if ($#c != 1) {
print "Wrong number of '_' in '$a'.\n";
$f++;
}
if ($b[1] =~ m/\D/) {
print "Wrong ID-character in '$a'.\n";
$f++;
}
if ($b[2] =~ m/[^a-zA-zäöüÄÖÜß]/) {
print "Wrong city-character in '$a'.\n";
$f++;
}
return $f;
}

Dann sollte der obige reguläre Ausdruck ja passen. Hast du das mal getestet?