Hallo,
ich habe im HTTPMOD Modul ein Reading erzeugt, das so ausschaut:
Zitat[["18","Gravensteiner-Platz","0"],["18","Lokalbahnhof","2"],["34","Mönchhofstraße","5"],["83","Lohrberg","3"],["34","Bornheim Mitte","5"],["18","Gravensteiner-Platz","17"],["34","Bornheim Mitte","15"],["18","Lokalbahnhof","17"],["30","Bad Vilbel Bahnhof","18"],["34","Mönchhofstraße","19"],["18","Gravensteiner-Platz","29"],["34","Bornheim Mitte","30"],["18","Lokalbahnhof","32"],["83","Lohrberg","33"]]
(Das sind Buslinien einer Haltestelle mit Ziel und der Abfahrtszeit in Minuten)
Diesen String möchte ich nach der 3. Spalte (Abfahrtszeit) aufsteigend sortieren. (Z.B. ist die 83 zum Lohrberg im String oben zu weit hinten und müsste um eine Position nach vorne). Kann ich das über eine Userreading-Funktion machen?
Danke für alle Tips,
Alex
sicherlich kriegst du das irgendwie im userreading hin, ich würde aber empfehlen, das in 99_myUtils auszulagern
my %hash = ();
my $result = '[';
while ($reading =~ /(\[".+?"([^"]+)"\])/g)
{
$hash{$2} = $1;
}
for my $key (sort {$a<=>$b} keys %hash)
{
$result .= $hash{$key};
}
$result .= ']';
So vielleicht in etwa. Der erste Part parsed den String in ein Hash und verwendet dabei jeweils die dritte Spalte als Key. Dann wird der hash nach den keys sortiert und wieder zurück ins result geschrieben.
Ist nur schnell runter geschrieben bzw. zusammen kopiert. Sind bestimmt noch irgendwo Bugs drin...
Danke Dir!
Der Code funktioniert schon mal mit dem Beispiel-String :-) Wenn es aber 2 gleiche Werte bei der Abfahrtszeit (3. Spalte) gibt, wird eine Verbindung gelöscht (hash kennt ja keine doppelten Keys).
Ich schau mal ob ich es auf ein Array umgebaut kriege...
Alex
my %hash = ();
my $result = '[';
while ($reading =~ /(\[".+?"([^"]+)"\])/g)
{
$hash{$1} = $2;
}
for my $key (sort {$hash{$a}<=>$hash{$b}} keys(%hash))
{
$result .= $key;
}
$result .= ']';
Gute Idee, das einfach rumzudrehen :) Funktioniert jetzt!
Danke,
Alex