Filterung und effiziente Sortierung großer HTML-Tabellen

Bei Auswertung großer Datenmengen entstehen sehr große HTML-Tabellen, welche vom Anwender

"on the fly" per Mausklick zu sortieren sind.

Ist die Filterung auf dem Client selbst recht schnell auszuführen, werden in Javascript (nach-)zuimplementierende Sortieralgorithmen schon bei verhältnismäßig kleiner Zeilenzahl durch exponentielle Abhängigkeit von Programmschritten zu Tabellenlänge so ineffizient, dass das implementierende Script nicht nur als hängend wahrgenommen, sondern meist auch vom Browser so klassifiziert wird.

Befindet sich die Ausgangstabelle als CSV-Datei auf dem (GNU/Linux-)Server und wurde deren Dateiname der Webseite mitgegeben, kann eine Sortierung durch die Abfolge von maximal effizient wie folgt erreicht werden:

Beispiel: Nexthink-Auswertung einer sehr großen Zahl von Außendienstrechnern

Bei Laden der Seite (aber auch nach jeder Ersetzung der Tabelle durch eine sortierte Fassung) werden zunächst die sichtbaren Spaltenheader und unsichtbaren Spalten-IDs durch Javascript numeriert.



Ebenso werden alle Spaltenheader mit Event-Listenern für die linke und rechte Maustaste so verknüpft, dass die Spalten-ID innerhalb des Mouse-Events an die Callback-Funktion übergeben wird.
Im Bild auskommentiert die ineffiziente Sortierlogik über ...



... einen optimierten Bubble-Sort-Algorithmus.



Stattdessen Ajax-Aufruf mit den Parametern Quelldatei (== csv-Quelle der Tabelle auf Server), Spalte, Sortierrichtung und -art (alphabetisch/numerisch).
Bei Laden der sortierten Tabelle werden wiederum die Spaltenheader wie vordem numeriert und mit Event-Listenern versehen.
Außerdem ist der vorherige Filterzustand der Tabelle auch in der sortierten Fassung wiederherzustellen.



Innerhalb des durch Ajax gerufenen PHP-Scripts werden mit den übergebenen Parametern eine Pipe zu einem Bash-Script für Sortierung der csv-Quelle nebst HTML-Wandlung geöffnet und das Ergebnis als Tabelle zurückgegeben.



Das Bash-Script steuert den Aufruf von GNU-sort und wandelt das csv-Ergebnis nach HTML.



Der Filteralgorithmus schließlich zerlegt auf dem Client (!) die Eingabe #1:2019-06-05|#2:BJ-4711-13|#3:Baustein in Paare von Spalten und Suchmustern, bevor alle Zeilen, welche eines der Spaltenmuster nicht erfüllen, ausgeblendet werden.




Impressum und Datenschutzerklärung