Thread Probleme mit Tausenderpunkt (5 answers)
Opened by sven2006 at 2008-09-30 17:11

sven2006
 2008-09-30 17:11
#115030 #115030
User since
2008-09-30
7 Artikel
BenutzerIn
[default_avatar]
Hallo ich bin absoluter Noob in Perl und versuche jetzt hier Hilfe zu bekommen.

Also ich spiele Ogame(Browserspiel) und habe ein älteres Allianzverwaltungstool übernommen, das mit keinem konkurrieren kann und es wäre zu schade wenn man das nicht aktualisiert bekommt
Nun versuch ich verzweifelt das das Tool auch die Tausenderpunkte erkennt. Bedeutet, ich kopiere aus einer vorhanden Seite die Werte und es wird dann ins Tool gepastet und in eine DB verwertet und im Tool augegeben.

in dem ersten Fall sieht es so aus:
Mitgliederliste (Anzahl: 8)
Nr. Name Status Punkte Koord Beitritt Online
1 MetaIIica Unischreck 2.460.037 [3:436:5] 2008-09-04 22:16:13 On

Problem ist jetzt da die [ ] und die Tausenderpunkte

Davor war es so:
Mitgliederliste (Anzahl: 8)
Nr. Name Status Punkte Koord Beitritt Online
1 MetaIIica Unischreck 2460037 3:436:5 2008-09-04 22:16:13 On

Das ist das was es im Moment erkennt.

der Code dazu:

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
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
if ($pasted ne "0") {
        my ($player, $points, $koo) = ("", -1, "");
        my $id;
        foreach (split(/\n/, $pasted)) {
                ($player, $points, $koo) = ("", 0, "");
                my $regex = Ogame::translate(/Nachricht_schreiben/);
                if (/$regex/) {
                        # firefox:
                        #9      Giggel  Nachricht schreiben     Ratsmitglied    251235  2:280:11        -       On
                        my @foo = split(/\t/);
                        ($player, $points, $koo) = ($foo[1], $foo[4], $foo[5]);
#                       print 'found1 ($player, $points, $koo) ='." ($foo[1], $foo[4], $foo[5])<br>";
                } elsif (/^\d+\t(.*)\t\t.*?\t\s*(\d+)\t\s*([0-9:]+)\s*\t/) {
                        # opera
                        #10     Julia           Drohne  35098   7:88:4  2006-03-31 12:31:39     On      
                        ($player, $points, $koo) = ($1, $2, $3);
#                       print 'found2 ($player, $points, $koo) ='." ($1, $2, $3)<br>";
                } elsif (/^\d+\s+(.*)\s+[\wü]+\s+(\d+)\s+(.*?)\s+/) {
                        ($player, $points, $koo) = ($1, $2, $3);
#                       print 'found3 ($player, $points, $koo) ='." ($1, $2, $3)<br>";
                }
                if (($player ne "") && ($points > -1) && ($koo ne "")) {
                        $sth = $dbh->prepare("select id from $uni{'name'}_allymember where player=?;");
                        $sth->execute($player);
                        if ($sth->rows == 0) {
                                $sth = $dbh->prepare("insert into $uni{'name'}_allymember set player=?, koo=?;");
                                $sth->execute($player, $koo);
                                $sth = $dbh->prepare("select id from $uni{'name'}_allymember where player=?;");
                                $sth->execute($player);
                                print "new player: $player ($koo)<br>";
#                               print "<br>insert into $uni{'name'}_allymember set player='$player', koo='$koo'<br>";
                        }
                        $id = $sth->fetchrow_array;
                        $sth = $dbh->prepare("update $uni{'name'}_allymember set timestamp=NOW() where id=?;");
                        $sth->execute($id);
                        $sth = $dbh->prepare("select age from $uni{'name'}_allymember_points where player_id=? and age=?;");
                        $sth->execute($id, $age);
                        if ($sth->rows == 0) {
                                $sth = $dbh->prepare("insert into $uni{'name'}_allymember_points set player_id=?, points=?, age=?;");
                                $sth->execute($id, $points, $age);
                        } else {
                                $sth = $dbh->prepare("update $uni{'name'}_allymember_points set points=? where player_id=? and age=?;");
                                $sth->execute($points, $id, $age);
                        }
                } else {
#                       print "Parse error: $_<br>";
                }
        }
}



Beim zweiten habe ich das gleiche Prob:
Neu:
Platz Spieler Allianz Punkte
401 * Hellrazor Nachricht schreiben KoC 2.585.555

Alt:
Platz Spieler Allianz Punkte
401 * Hellrazor Nachricht schreiben KoC 2585555

Code:
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
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
if (defined($cgi->param('parse'))) {
        @lines = split(/\n/, $cgi->param('pasted'));
        my $line;
        $text .= "<table border>\n";
        $text .=  "<tr><td colspan=4>Update <small>(wenn leer, ging was schief!)</small></td></tr>\n";
        $text .=  "<tr><td>Platz</td><td>Spieler</td><td>Ally</td><td>Punkte</td></tr>\n";
        my $i = 0;
        my $cnt = 0;
        foreach $line (reverse @lines) {
                #3   +  PG Power                kaffee  178392  
                #4   –         sand            kaffee  176800  
                #5   *  Done it Duncan          XCT     159366  
                next unless ($line =~ /[^\s]/);
                my @valuez = split(/\t/, $line);
                next unless(defined($valuez[4]));
                foreach (@valuez) {
                        s/^\s*//;
                        s/\s*$//;
                }
                $valuez[0] =~ /^(\d+)/;
                $valuez[0] = $1;
                $valuez[4] =~ s/[^\d]//g;
                next unless (defined(($valuez[0])));
                next if ($valuez[4] eq "");
                next if ($valuez[4] =~ /[^\d]/);
                if ($i == 0) {
                        $sth = $dbh->prepare("select platz from $uni{'name'}_ogame_players order by platz desc limit 1;");
                        $sth->execute();
                        my $last = $sth->fetchrow_array;
                        for ($i = $last + 1; $i <= $valuez[0]; $i++) {
                                $sth = $dbh->do("insert into $uni{'name'}_ogame_players set platz='$i';");
                                $cnt++;
                        }
                        $i = 1;
                }
                if (($valuez[0] =~ /(\d+)/) && ($valuez[1] ne "")){
                        $sth = $dbh->do("update $uni{'name'}_ogame_players set ally='$valuez[3]', punkte='$valuez[4]', name='$valuez[1]', date=NOW() where platz='$1';");
                        $cnt++;
                        $text .=  "<tr><td>$1</td><td>$valuez[1]</td><td>";
                        if ($valuez[3] ne "") {
                                $text .=  $valuez[3];
                        } else {
                                $text .=  "&nbsp;";
                        }
                        $text .=  "</td><td>$valuez[4]</td></tr>\n";
                } else {
                        $text .=  "<!--tr><td colspan=4>Diese Zeile wird ignoriert: $line</td></tr-->\n";
                }
        }
        $text .=  "</table>\n$cnt Zeilen wurden verwendet";
} 


dritte wäre das hier:

neu:
Platz Allianz Memb. Punkte
1 * Xel FoCC 19 127.335.357

alt
Platz Allianz Memb. Punkte
1 * Xel FoCC 19 127335357

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
24
25
26
27
28
29
30
31
32
33
34
35
36
if ($parse_stats == 1) {
        my $pasted = $cgi->param('pasted');
        if ($pasted eq "") {
                print '<center><b style="font-size:20pt; color:#EE0000;">dumm geklickt, was?</b></center><br>';
        } else {
#               $sth = $dbh->prepare("delete from allystats where date=curdate();");
#               $sth->execute;
                my ($place, $ally, $members, $points, $valid) = (0, "", 0, 0, 0);
                my @todo = ();
                my ($start, $end) = (99999, 0);
                foreach (split(/\n/, $pasted)) {
                        # 1   *         T.u.C           17      43842   2578
                        next unless (/^\s*\d+/);
                        my @arr = split(/\s+/, $_);
                        if ($#arr >= 5) {
                                if ($arr[0] > 0) {
                                        $place = shift @arr;
                                        $start = $place if ($place < $start);
                                        $end = $place if ($place > $end);
                                        shift @arr; pop @arr;
                                        $points = pop @arr;
                                        $members = pop @arr;
                                        $ally = join(" ", @arr);
                                        push(@todo, "insert into $uni{'name'}_allystats set ally='$ally', members='$members', points='$points', date=curdate(), place='$place';");
                                        $valid++;
                                }
                        } else {
                                #print "Fehler beim parsen der Zeile: ".join(" ", @arr)."<br>\n" if (@arr != ());
                        }
                }
                $sth = $dbh->prepare("delete from $uni{'name'}_allystats where place>=? and place<=? and date=curdate();");
                $sth->execute($start, $end);
                $sth = $dbh->do($_) foreach (@todo);
                $template->param(TMP => "Es konnten $valid Zeilen benutzt werden (Pl&auml;tze $start - $end).");
        }
}


Meine Idee wäre das die Tausenderpunkte und die [] in irgendeiner Form ignoriert werden

Kann mir da einer helfen? Ich sags von vornherein, ich hab nicht die geringste Ahnung von Perl und wäre auch mit externen Lektüre hoffnungslos überfordert. Ich wäre euch dankbar wenn ihr mir da helfen könntet

lg
Sven

View full thread Probleme mit Tausenderpunkt