Sortieren einer Tabelle nach mehreren Feldern
Drex
- perl
0 RoRo
Ich möchte eine Fussballtabelle sortieren, jedoch ist das leider nicht
so leicht, wie ich gehoft habe :-(
Ausserdem, muss ich dazu sagen, das dies mein erstes Perl-Programm ist,
also nicht schrecken, wenn manches vielleicht einfacher geht.
Meine Tabelle besteht aus:
Mannschaft|Spielanzahl .. sonstiges .. |Tordifferenz|Punkte
Folgender Code liest (bis jetzt) die Tabelle aus einer Textdatei,
sortiert sie nach Punkten (15. Spalte) und speichert die geordnete
Liste wieder im Textfile ab.
Nun muss ich aber die Tabelle noch mal sortieren, jedoch nur die Zeilen,
wo die Punktezahl gleich ist soll nach der Tordifferenz (14. Spalte)
sortiert werden. Das heist, wenn die ersten drei Mannschaften 9 Punkte
haben, müssen sie nach der Tordifferenz sortiert werden. Wer die
größte Zahl als Tordifferenz hat steht ganz oben. Das gleiche bei allen
darunterliegenden Mannschaften, die Punkte vergleichen und bei gleicher
Punktzahl nach der Tordifferenz sortieren.
Dazu brauch ich einen Algorithmus, der Zeile für Zeile liest, die Punkte
vergleicht, und wenn Zeilen die gleiche Punkteanzahl haben, die Zeilen
in eine neue Liste wirft, welche ich dann wieder mit "sort" nach
Tordifferenz sortiere und neu geordnet in die alte Liste zurück schreibe.
Hört sich alles recht schön an, meine Theorie, aber wie verwirkliche
ich diesen Algo? Hört sich nach einem Schleifengewirr an?
Bin für jede Hilfe dankbar. Ich hoffe jemand kann mir helfen.
#Tabelle sortieren
sub tabelle_sortieren
{
#Speicher für alle Mannschaften
my @Mannschaften;
#Speicher für alle Mannschaften in Liste
my @Mannschaften_Liste;
#Speicher für eine Mannschaft
my @Mannschaft;
#Anzahl der Mannschaften
my $mannschaften_anzahl = 0;
#Zähler
my $i = 0;
#Tabellenfile öffnen
open (TABELLE , "<$tabellen_file") || die "Kann die Datei ($tabellen_file) nicht zum Lesen öffnen.";
#Zähler reseten
$i=0;
#solange Daten im Tabellenfile sind
while (<TABELLE>)
{
#Mannschaften in @Mannschaften einlesen
$Mannschaften[$i] = $_;
#Zähler erhöhen
$i++;
}
#Tabellenfile schließen
close (TABELLE);
#Anzahl der Mannschaften setzen
$mannschaften_anzahl = i;
#solange Mannschaften in @Mannschaften sind
foreach $mannschaften_line (@Mannschaften)
{
#aktuelle Mannschaft aufdröseln
@Mannschaft = split(/|/,$mannschaften_line);
#Mannschaften als Liste in Liste legen
push (@Mannschaften_Liste, [ @Mannschaft ] );
}
#Mannschaften_Liste sortieren nach Punkte
@Mannschaften_Liste = sort { $b->[14] <=> $a->[14] } @Mannschaften_Liste;
##########################################
##
## hier fehlt leider das Entscheidende :-(
##
##########################################
#Tabellenfile öffnen
open (TABELLE , ">$tabellen_file") || die "Kann die Datei ($tabellen_file) nicht zum Schreiben öffnen.";
#Zähler reseten
$i=0;
#solange Mannschaften in @Mannschaften_Liste sind
for(@Mannschaften_Liste)
{
#aktuelle Mannschaft in Datei schreiben
print TABELLE "$Mannschaften_Liste[$i][0]|$Mannschaften_Liste[$i][1]|$Mannschaften_Liste[$i][2]|$Mannschaften_Liste[$i][3]|$Mannschaften_Liste[$i][4]|$Mannschaften_Liste[$i][5]|$Mannschaften_Liste[$i][6]|$Mannschaften_Liste[$i][7]|$Mannschaften_Liste[$i][8]|$Mannschaften_Liste[$i][9]|$Mannschaften_Liste[$i][10]|$Mannschaften_Liste[$i][11]|$Mannschaften_Liste[$i][12]|$Mannschaften_Liste[$i][13]|$Mannschaften_Liste[$i][14]";
#Zähler erhöhen
$i++;
}
#Tabellenfile schließen
close (TABELLE);
}
Hi,
Ausserdem, muss ich dazu sagen, das dies mein erstes Perl-Programm ist,
Na dafür haste aber so richtig reingelangt :)
http://www.perl.com/CPAN-local/doc/FMTEYEWTK/sort.html
o.g. Link findest du in der perldoc -perlfaq4 ...
Have Fun; Rolf