Schrift
[thread]12379[/thread]

mal wieder regex (parsen von Datei)

Tags: Ähnliche Threads

Leser: 2


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Froschpopo
 2008-08-20 03:46
#113723 #113723
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
schonwieder so ein blödes regex-kuddelmuddel der mir seit stunden Nerven kosten:

Habe eine Datei mit Schulen die etwas merkwürdig konstruiert ist (nicht von mir)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
NAME DER SCHULE
Halbachschule

Gesamtschule
STADT
Duisburg


NAME DER SCHULE
Erich-Kästner Gesamtschule
mit Förderschule
STADT
Augsburg


NAME DER SCHULE
Albert-Schweitzer-Schule

Städt. Ev. Grundschule
mit angeschlossener Musikschule
STADT
Bonn


Grundsätzlich muss man wissen:
Der Name der Schule ist immer die nächste Zeile nach "NAME DER SCHULE".
Danach folgt irgendein Text der die Schule beschreibt oder sonstige Infos zu der Schule enthält. Dieser Text hat oft mehrere Zeilen.

Mein Ansatz war folgender:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;

chdir("/srv/www/projekt/schulen")
        || die "Fehler: $!\n";

local(*FH, $/);
open FH, "test.txt"
        || die "Fehler: $!\n";

my $file = <FH>;

my @rows = $file =~ /NAME DER SCHULE([a-zA-Z_0-9\s\-\n\r\.üöäß]+)STADT/g;

my $counter = 0;
for (@rows) {
        $counter++;
        print "$counter\t$_\n";
}

Das gibt mir folgendes Ergebnis:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
localhost:/home/frosch/scripts # perl schools.pl
1
Halbachschule

Gesamtschule
STADT
Duisburg


NAME DER SCHULE
Erich-Kästner Gesamtschule
mit Förderschule
STADT
Augsburg


NAME DER SCHULE
Albert-Schweitzer-Schule

Städt. Ev. Grundschule
mit angeschlossener Musikschule


Warum findet er nur einen Treffer????
In der for-Schleife will ich jeweils die Infos zu der Schule haben, also alles zwischen "NAME DER SCHULE" und "STADT"
LanX-
 2008-08-20 04:30
#113724 #113724
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
warum zum Jonathan willst du es mit eienr RegEx machen?
Lese die Zeilen linear weise ein und mache immer bei "NAME DER SCHULE" einen Schnitt!

Deine RegEx betreffend: setz dich mal mit dem /m und /s modifiern auseinander.
Alter
 2008-08-20 10:01
#113725 #113725
User since
2008-02-27
67 Artikel
BenutzerIn
[default_avatar]
lass dir doch mal anzeigen wieviel in dem array drinne steht.
am ende ist da was falsch das nur eine zeile im array ist?
The only way to survive! Before and after the year 2000, 3000, 4000, ... and tomorrow, too! Linux forever
moritz
 2008-08-20 10:16
#113727 #113727
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Code (perl): (dl )
1
2
3
local $/ = "NAME DER SCHULE\n"
my @schools = <FH>;
chomp @schools;
topeg
 2008-08-20 12:56
#113743 #113743
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ein typisches "kann doch jeder lesen" Format einer Sekretärin. :-)
Ungetestet:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl
use strict;
use warnings;

my $filename='/srv/www/projekt/schulen/test.txt';

my $data="";

{
  local $/=undef;
  open(my $fh, '<', $filename) or die "ERROR open $filename ($!)";
  $data=<$fh>;
  close($fh);
}

while(my ($schulname,$stadt)=$data=~/NAME DER SCHULE\s+(.+?)\s+STADT\s+(\S+)\s+/sgc)
{
  print <<EOF;
Schulname: $schulname
Stadt:     $stadt

EOF
}
LanX-
 2008-08-20 12:56
#113745 #113745
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
@moritz: schicke Lösung, aber eine weiter Unterteilung schafft er damit nicht mehr...

In solchen Fällen kann man gut mit verschachtelten Flip-Flop Operator .. arbeiten.
Und wenn man schon Zeilenblöcke zerlegen möchte böte sich split // an.
pq
 2008-08-20 14:01
#113756 #113756
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
LanX-+2008-08-20 10:56:48--
@moritz: schicke Lösung, aber eine weiter Unterteilung schafft er damit nicht mehr...

wieso das denn nicht?
erst nach "NAME DER SCHULE" trennen und dann nach newlines. sehe jetzt kein problem darin.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
LanX-
 2008-08-20 14:13
#113759 #113759
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
@pq: wg. "STADT" und ähnlicher Felder.

... naja muss mich relativieren, es gibt noch nen Trick von einem String statt von einem File zu lesen, der mir aber gerade nicht einfällt.
moritz
 2008-08-20 14:19
#113761 #113761
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
LanX-+2008-08-20 12:13:42--
... naja muss mich relativieren, es gibt noch nen Trick von einem String statt von einem File zu lesen, der mir aber gerade nicht einfällt.


Code (perl): (dl )
open my $handle, \$scalar;


sowas vielleicht?
pq
 2008-08-20 14:34
#113763 #113763
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
LanX-+2008-08-20 12:13:42--
@pq: wg. "STADT" und ähnlicher Felder.

ich seh trotzdem kein problem. deine aussage war ja, dass man nach moritz' code
keine möglichkeit mehr hat, das aufzusplitten. ich sehe jedoch nicht, warum man nicht einfach
split nehmen könnte, um die einzelnen einträge nochmal aufzusplitten.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2008-08-20 03:46.