FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: All-Ex am 22 April 2018, 21:06:32

Titel: Frage: Array sortieren per Userreading-Funktion
Beitrag von: All-Ex am 22 April 2018, 21:06:32
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
Titel: Antw:Frage: Array sortieren per Userreading-Funktion
Beitrag von: KernSani am 24 April 2018, 23:50:25
sicherlich kriegst du das irgendwie im userreading hin, ich würde aber empfehlen, das in 99_myUtils auszulagern
Titel: Antw:Frage: Array sortieren per Userreading-Funktion
Beitrag von: mumpitzstuff am 25 April 2018, 00:25:35

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...
Titel: Antw:Frage: Array sortieren per Userreading-Funktion
Beitrag von: All-Ex am 26 April 2018, 23:18:03
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
Titel: Antw:Frage: Array sortieren per Userreading-Funktion
Beitrag von: mumpitzstuff am 27 April 2018, 00:10:31
my %hash = ();
my $result = '[';
while ($reading =~ /(\[".+?"([^"]+)"\])/g)
{
  $hash{$1} = $2;
}
for my $key (sort {$hash{$a}<=>$hash{$b}} keys(%hash))
{
  $result .= $key;
}
$result .= ']';
Titel: Antw:Frage: Array sortieren per Userreading-Funktion
Beitrag von: All-Ex am 27 April 2018, 07:10:55
Gute Idee, das einfach rumzudrehen  :) Funktioniert jetzt!

Danke,
Alex