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

RegEx gesucht: ziemlich groß



<< >> 9 Einträge, 1 Seite
pktm
 2003-09-30 21:46
#59173 #59173
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Habe hier eine 7,5MB große textdatei mit sochen Zeilen hier:
Code: (dl )
1
2
3
4
5
6
7
<a href='anzeig.pl?lnr=2689&art=stadt&nr=5048'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Un-Rockbar
Besitzer: Ice_King
Punkte: 144
Bündnis: FuckingGrandpas'></a><a href='anzeig.pl?lnr=2689&art=stadt&nr=5049'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Ulgarth
Besitzer: Core
Punkte: 1202
Bündnis: DDH'></a>

Der Zeilenumbruch entspricht dem in der Datei.
Jetzt würde ich daraus gerne haben:
Name: Un-Rockbar
Besitzer: Ice_King
Punkte: 144
Bündnis: FuckingGrandpas
Und das ganze von dem danach.
Wie realisiere ich das jetzt?
Meine ersten Gehevrsuche sind - abgesehen von lächerlich - erfolglos geblieben.
(Habe erstaml versucht überhaupt erstmal die Zeile zu treffen...)
Code: (dl )
1
2
3
4
5
6
foreach( @save ){
if( $_ =~ m|<img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Un-Rockbar Besitzer: Ice_King Punkte: 144 Bündnis: FuckingGrandpas'></a><a href='anzeig.pl?lnr=2689&art=stadt&nr=5049'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Ulgarth Besitzer: Core Punkte: 1202 Bündnis: DDH'></a>| ){
print "$_\n";
last;
}
}

Hilfe! ;)
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2003-10-01 00:14
#59174 #59174
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bitte diesen Beitrag ignoieren => die Frage passt nicht so wirklich dazu....

7,5 MB in einen einzigen String einzulesen ist schon ein wenig speicherfressend... sind die Datensaetze zufaellig durch eine Leerzeile getrennt? Wenn ja, koenntest du was auf die Art:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
unless (open (FILE, $filename)) {
 # errorhandling
}
else {
 local $/ = "\n\n";
 while (<FILE>) { # $_ enthaelt nun einen Block

 } # while
 close (FILE);
} # else

oder mit CPAN:Tie::File arbeiten und dem Konstruktor als recsep = "\n\n"; mitgeben.

Falls nicht, kannst du vielleicht den Umbrechpunkt durch \nName:\s+ festlegen, z.B.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my $recordSeparator = "\nName:\s+";
unless (open (FILE, $filename)) {
 # errorhandling
}
else {
 local $/ = $recordSeparator;
 while (<FILE>) {
   chomp($_); # entfernt $recordSeparator am Ende
   s/^\Q$recordSeparator\E//; # entfernt beim ersten Datensatz $recordSeparator
   my ($name, @rest) = split(/\n/, $_);
   my %item = (Name => $name);
   foreach my $line (@rest) {
     my ($key, $value) = split(/\:\s+/, $line, 2); # an : aufsplitten
     $item{$key} = $value;
   } # foreach
   
   # mach was mit %item
 } # while
 close (FILE);
} # else
\n\n

<!--EDIT|Strat|1064953555-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Geewiz
 2003-10-01 00:17
#59175 #59175
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn ich das richtig sehe, stecken alle Infos im ALT-Attribut der IMG-Tags. Letztere würde ich zunächst mit einer Regex oder sogar mit HTML::Parser extrahieren und mir dann das ALT-Attribut mit einer Regex vornehmen. Eine Vorgehensweise nach dem Motto "teile und herrsche" quasi.
Dubu
 2003-10-01 14:30
#59176 #59176
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Hier mal eine nette, kleine Loesung mit HTML::Parser:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl
use warnings;
use strict;
use HTML::Parser;

# Hier wird jedes Start-Tag ausgewertet
sub parse_start {
   return unless $_[0] eq 'img';   # nur IMG-Tags
   return unless exists $_[1]->{alt}; # alt-Attribute vorhanden?
   my $alttext = $_[1]->{alt};
   # mach was mit $alttext
   print ">>>\n$alttext\n<<<\n";
}

# Parser definieren
my $p = HTML::Parser->new ( api_version => 3,
   start_h => [     # Handler fuer Start-Tags
       \&parse_start, 'tag, attr'  # Uebergib Tag und Attribute
   ],
);

# Start des Parsers, hier mit Daten aus dem _ _DATA_ _ Anhang
$p->parse_file(*DATA);

_ _DATA_ _
<a href='anzeig.pl?lnr=2689&art=stadt&nr=5048'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Un-Rockbar
Besitzer: Ice_King
Punkte: 144
Bündnis: FuckingGrandpas'></a><a href='anzeig.pl?lnr=2689&art=stadt&nr=5049'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Ulgarth
Besitzer: Core
Punkte: 1202
Bündnis: DDH'></a>

Wie ueblich muss man sich die Unterstriche um DATA zusammen haengend vorstellen - was vom Board leider immer noch geloescht wird.
pktm
 2003-10-01 21:59
#59177 #59177
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja hey, super - genau das habe ich gebraucht.
Bei mir sieht es jetzt so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
sub parse_start {
return unless $_[0] eq 'img'; # nur IMG-Tags
#return unless exists $_[1]->{alt}; # alt-Attribute vorhanden?
return unless exists $_[1]->{src}; #meins
return unless $_[1]->{src} =~ /k1j|k0j/;
my $alttext = $_[1]->{alt};
my $src = $_[1]->{src};
# mach was mit $alttext
print "\n$alttext $src\n";
}

Die $src brauch eich, weil ja auch Felder leer sein könne.
Die haben dann kein Alt-Tag, sondern sind nur über ihren Dateinamen zu erkennen.

Jetzt müsste ich aber zusätzlich zu dem, was ich oben auslese noch 2 input-Felder auslesen.
Davon gibt es 2 mit den Namen k1 und k2.
Das sieht dann so aus:
Code: (dl )
1
2
<p class='mitte'>Mittlere Koordinate:<input type="text" name="k1" value="52" maxlength="3" size="3">.<input type="text" name="k2" value="48" maxlength="3" size="3">
<input type="submit" value="Go" name="go"></p>

Die brauche ich, um die ausgelesenen Städte ihren Koordinaten zuordnen zu können.
Das ganze wollte ich dann in einer Hash-Datenstruktur unterbringen.
Hat wer eine Vorstellung, wie ich das mache?
mfg pktm\n\n

<!--EDIT|pktm|1065032386-->
http://www.intergastro-service.de (mein erstes CMS :) )
Geewiz
 2003-10-02 01:00
#59178 #59178
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=pktm,01.10.2003, 19:59]Jetzt müsste ich aber zusätzlich zu dem, was ich oben auslese noch 2 input-Felder auslesen.
Davon gibt es 2 mit den Namen k1 und k2.
[...]
Die brauche ich, um die ausgelesenen Städte ihren Koordinaten zuordnen zu können.
Das ganze wollte ich dann in einer Hash-Datenstruktur unterbringen.
Hat wer eine Vorstellung, wie ich das mache?[/quote]
Nein, verrate es uns doch. ;)

Mit dem CGI-Modul kannst du per param() deine Feldinhalte abfragen, und dann ab ins Hash damit.
Dubu
 2003-10-02 17:19
#59179 #59179
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Das Tag heisst "input", die Attribute heissen "name" und "value", wenn ich das richtig sehe. Muss eben nur noch in parse_start() eingebaut werden, zusaetzlich zu den "img" Tags. :)\n\n

<!--EDIT|Dubu|1065100790-->
pktm
 2003-10-02 20:41
#59180 #59180
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Mein Versuch:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!c:/usr/bin/perl -w
# ---------------------------------------------------
# KartenScript für SchlachtPlatz 2
# ---------------------------------------------------
# MODULE
# ---------------------------------------------------
use strict;
use warnings;
use diagnostics;
use CGI qw/:standard/;
use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
$CGI::POST_MAX=1024 * 100; # max 100K posts
$CGI::DISABLE_UPLOADS = 1; # no uploads
use Data::Dumper;
use HTML::Parser;
use vars;
# ---------------------------------------------------
# KONSTANTEN
# ---------------------------------------------------
use constant UNIX => 0; # Unix y/n
# ---------------------------------------------------
# VARIABLEN
# ---------------------------------------------------
# --- CGI
$| = 1;
my $cgi = CGI->new();
my $query = $cgi->Vars; #extract parameters

# ---------------------------------------------------
# LOGIK
# ---------------------------------------------------

print \print_koords(*DATA)->{1};
#print print_map(*DATA);


# ---------------------------------------------------
# SUBS
# ---------------------------------------------------
sub print_koords {
my $p = HTML::Parser->new ( api_version => 3,
start_h => [ # Handler fuer Start-Tags
\&parse_start, 'tag, attr', # Uebergib Tag und Attribute
],
);
return $p->parse_file(*DATA);
} #print_koords

sub print_map {
my $p_i = HTML::Parser->new ( api_version => 3,
start_h => [ # Handler fuer Start-Tags
\&parse_start_i, 'tag, attr' # Uebergib Tag und Attribute
],
);
return $p_i->parse_file(*DATA);
} #print_map

sub parse_start {
return unless $_[0] eq 'img'; # nur IMG-Tags
#return unless exists $_[1]->{alt}; # alt-Attribute vorhanden?
return unless exists $_[1]->{src}; #meins
return unless $_[1]->{src} =~ /k1j|k0j/;
my $alttext = $_[1]->{alt};
my $src = $_[1]->{src};
# mach was mit $alttext
#print "\n$alttext $src\n";
}

sub parse_start_i {
return unless $_[0] eq 'input'; # nur IMG-Tags
return unless exists $_[1]->{name}; # name-Attribute vorhanden?
return unless $_[1]->{name} =~ /k1|k2/;
my $koN = $_[1]->{name};
my $ko = $_[1]->{value};
# mach was mit $alttext
#print "\n$koN = $ko\n";
}


<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
...~100 Zeilen gekürzt...
http://www.intergastro-service.de (mein erstes CMS :) )
Dubu
 2003-10-03 16:14
#59181 #59181
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Diese Loesung ist ineffizient, weil du zweimal die gesamte Datei parst.
Ausserdem ist immer noch dieses komische "print \print_koords(*DATA)->{1}" da drin, dessen Sinn mir nicht klar ist. Hast du denn mal in die Doku zu HTML::Parser hineingeschaut? Ich weiss, die ist ziemlich lang, aber die Methodenaufrufe stehen ziemlich weit oben, da steht auch, dass ein $p->parse_file() einfach das $p oder - bei Fehler - undef zurueckliefert.

Leider sagst du nicht, wie die 'img' und 'input' Tags zusammen haengen. Wie stehen diese in der Datei? Abwechselnd? Wie machst du die Zuordnung?

Nun ja, ich gehe mal davon aus, dass die Tags jeweils in der gleichen Reihenfolge stehen und sich somit in Arrays sammeln lassen. Eleganter waere es, die Zuordnung und Weiterverarbeitung gleich im Handler vorzunehmen, aber mit globalen Arrays geht es auch.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/perl
use warnings;
use strict;
use HTML::Parser;

my (@Staedte, @Koord1, @Koord2);    # globale Variablen fuer Parser-Ergebnisse

sub parse_start {
   if ($_[0] eq 'img') {
       return unless exists $_[1]->{alt}; # alt-Attribute vorhanden?
       push @Staedte, $_[1]->{alt};
   } elsif ($_[0] eq 'input') {
       if ($_[1]->{name} eq 'k1') {
           push @Koord1, $_[1]->{value};
       } elsif ($_[1]->{name} eq 'k2') {
           push @Koord2, $_[1]->{value};
       }
   }
}

my $p = HTML::Parser->new ( api_version => 3,
   start_h => [        # Handler fuer Start-Tags
       \&parse_start,
       'tag, attr',    # Uebergib Tag und Attribute
   ],
);
$p->report_tags (qw(img input)); # nur diese Tags beachten

$p->parse_file(*DATA);

# Ausgabe der Ergebnisse
for (0..$#Staedte) {
   print "$Staedte[$_]\n===> ($Koord1[$_], $Koord2[$_])\n";
}

_ _DATA_ _
<a href='anzeig.pl?lnr=2689&art=stadt&nr=5048'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Un-Rockbar
Besitzer: Ice_King
Punkte: 144
Bündnis: FuckingGrandpas'></a><a href='anzeig.pl?lnr=2689&art=stadt&nr=5049'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Ulgarth
Besitzer: Core
Punkte: 1202
Bündnis: DDH'></a>
<!-- kommen die einfach hier hinter??? -->
<p class='mitte'>Mittlere Koordinate:<input type="text" name="k1" value="52" maxlength="3" size="3">.<input type="text" name="k2" value="48" maxlength="3" size="3">
<input type="submit" value="Go" name="go"></p>
<p class='mitte'>Mittlere Koordinate:<input type="text" name="k1" value="42" maxlength="3" size="3">.<input type="text" name="k2" value="24" maxlength="3" size="3">
<input type="submit" value="Go" name="go"></p>

Das _ _DATA_ _ bitte wieder zusammenfuegen.

Mit dem report_tags() habe ich noch eine kleine Optimierung eingebaut, damit der Handler nicht so oft aufgerufen werden muss.
<< >> 9 Einträge, 1 Seite



View all threads created 2003-09-30 21:46.