sortieren nach IP

  • Hallo allerseits, ich habe ein kleines script was mir ein Logfile auswerten soll, dieses Logfile hat folgende Struktur:

    Code
    2024/06/23 18:02:36 - Client connected
    2024/06/23 18:02:36 - action=login pcname=N210708_b mac=5C61994A3157 ip=192.168.178.22 time=18:02:36
    2024/06/23 18:06:55 - Client connected
    2024/06/23 18:06:55 - action=logout pcname=N210708_B mac=5C61994A3157 ip=192.168.178.22 time=18:06:55
    2024/06/23 18:10:30 - Client connected
    2024/06/23 18:10:30 - action=login pcname=N210708_B mac=5C61994A3157 ip=192.168.178.22 time=18:10:30
    2024/06/23 18:13:50 - Client connected
    2024/06/23 18:13:50 - action=logout pcname=N210708_B mac=5C61994A3157 ip=192.168.178.22 time=18:13:50
    2024/06/23 18:18:20 - Server started and listening on port 8085

    Mir ist es inzwischen geglückt die Sortierfunktion zum Laufen zu bringen. Das einzige Problem was ich habe ist die Sortierung der IPS, hat da jemand ne Idee? Für sachdienliche Hinweise wär ich sehr dankbar

    lg und eine schöne Woche noch

    2 Mal editiert, zuletzt von casi4712 (4. Juli 2024 um 09:15)

  • IPs sind in AutoIt einfach nur Strings.
    Strings werden in AutoIt, wenn sie mit den eingebauten Funktionalitäten (">", "<", "=", "==", StringCompare) verglichen werden, zeichenweise verglichen.
    Die Sortierfunktion _ArraySort() verwendet lediglich die eingebauten Vergleichsfunktionen während der Sortierung.

    Bei IP-Adressen führt ein Zeichenweiser Vergleich jedoch nicht zum gewünschten Ergebnis.

    Es gibt da mehrere Ansätze:

    Ansatz 1: weitere Spalte mit Datenkonvertierung:

    1. Dem Array eine weitere Spalte hinzufügen (per ReDim)
    2. Nun zeilenweise durchgehen
    3. Dabei die gewünschte Eigenschaft (hier Spalte 3) so konvertieren, dass AutoIt-Bordvergleiche diese wie gewünscht behandeln.
    4. Im Falle von IP-Adressen könnte man z.B. den 32 Bit-Integer-Wert, welchen sie repräsentieren, ableiten (eigene Funktion hierfür schreiben).
    5. Nun das Array mit _ArraySort() nach dieser letzten Spalte sortieren.
    6. Die letzte Spalte wieder löschen (ReDim)
    7. Fertig

    Ansatz 2: Sortierfunktion mit nutzerdefinierter Vergleichsfunktion nutzen:

    Es gibt Funktionen, welche es zulassen, dass die Vergleichsfunktion für die Sortierung vom Nutzer definiert werden kann.
    Eine dieser findest du in der >>ArrayPlus-UDF<<. Und deine Aufgabe lässt sich damit dann folgdendermaßen lösen:

  • Ich würde die IP in ihre 4 Teile gesplittet in ein Array legen und dann sortieren mit der Funktion von UEZ :

  • okidoki danke für das Feedback Leudde, Moombas, das klingt nach nem Plan das hatte ich auch schon versucht, weil ich das schon von Excel her kenne, kam aber nicht so recht weiter. Dann schaue ich mir mal Deinen Ansatz an.


    Danke noch mal und

    schönen Tag noch

  • Denk dran, wenn du die IP splittest das beim Eintragen ins Array gleich explizit in eine Zahl umzuwandeln, damit er nicht nachher meint es wäre text, sonst kommt nämlich nicht das richtige Ergebnis raus (z.B. 100 nach der 1 aber vor der 2 etc.)

  • Ähm ich hab das gerade versucht auf mein Script anzuwenden, aber habe gesehen du ersgtellst ja ein Array, wo die NUmmern schon von vornherein getrennt sind, [192, 168, 23, 145, "Büro 101"], _ , bei mir sind es ja komplette IPs im Logfile, also 192.168.100.10 usw. Kann die Funktion damit auch umgehen?

  • Hier das QuD sample:

  • Erstmal ausgiebig testen bevor du das machst ;)

    Bei meinen QuD kann sich auch mal ein (Denk-)Fehler einschleichen :D

    btw.: time hast du doppelt drinne (vorne und hinten) in deinem log

  • Ich werf noch mal eine andere Lösung in den Ring, die auch den Ansatz von AspirinJunkie verfolgt: Sortieren nach der IP als Zahl. Wobei ich den BinaryString nehme, weil die Zahl manchmal negativ wäre.

    Du bekommst also nach dem parsen ein Array mit 2 Werten, dem BinaryString der IP zum sortieren und eine Map mit allen Werten.

  • also nur noch mal zum Verständnis von Lösung A, im Grunde macht das aber nichst anders wie meine Lösung, Einzelspalten, den String sortieren, mein Problem wird jetzt also sein die IP Spalte erst mal auf 4 Einzelstrings zu teilen, vor dem sortieren udn dannn weider zusammenzusetzten, richtig? Und dann solte mein Sortieralgorhitmus ja auch funktionieren


    ich schau mir mal deinen zweiten Vorschlag an @Kana;)


    Danke noch mal

  • Also ich habs mal durchlaufne lassen und hab in der Logdef mal eine IP auf 192.168.100.5 gesetzt, diese würde ich bei der IP Sortierung aufsteigend auch oben erwarten und nicht unten, denke wir haben uns da missverstanden;)


    lg


    1. For sorting: 11000000101010001011001000010110
    1. LogDate: 2024/06/23
    1. LogTime: 18:02:36
    1. Action: login
    1. PCName: N210708_b
    1. Mac: 5C61994A3157
    1. IP: 192.168.178.22
    1. Time: 18:02:36
    2. For sorting: 11000000101010001011001000010110
    2. LogDate: 2024/06/23
    2. LogTime: 18:06:55
    2. Action: logout
    2. PCName: N210708_B
    2. Mac: 5C61994A3157
    2. IP: 192.168.178.22
    2. Time: 18:06:55
    3. For sorting: 11000000101010001011001000010110
    3. LogDate: 2024/06/23
    3. LogTime: 18:10:30
    3. Action: login
    3. PCName: N210708_B
    3. Mac: 5C61994A3157
    3. IP: 192.168.178.22
    3. Time: 18:10:30
    4. For sorting: 11000000101010001011001000000101
    4. LogDate: 2024/06/23
    4. LogTime: 18:13:50
    4. Action: logout
    4. PCName: N210708_B
    4. Mac: 5C61994A3157
    4. IP: 192.168.178.5
    4. Time: 18:13:50

  • ich würde die IP Blöcke alle auf 3 stellen jeweils links mit Nullen auffüllen, die Blöcke zu einer 12-stelligen Zahl zusammensetzen,

    in eineZahl umwandeln und dann sortieren.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Also ich habs mal durchlaufne lassen und hab in der Logdef mal eine IP auf 192.168.100.5 gesetzt, diese würde ich bei der IP Sortierung aufsteigend auch oben erwarten und nicht unten, denke wir haben uns da missverstanden;)

    Die Sortierung hab ich auch gar nicht implementiert, ich hab nur die Daten aufbereitet.

    Dafür brauchst du aber auch nur ein _ArraySort($arLogData) in Zeile 17 nach dem Local $arLogData = _parseLog($sLogData) einfügen. (Und das #include<Array.au3> natürlich)

    MfG Kanashius

  • Dann will ich auch noch eine Möglichkeit beisteuern (vom Prinzip her wie bei Kanashius, nur mit 32Bit UINT):

    Wenn man die Daten gleich im UINT-Format speichert, braucht man sie nur bei der Anzeige zurückwandeln.

  • Ich interpretiere das mal so, dass meine 2. Variante keine Rolle mehr spielt - nun gut.
    Dann halt auch mal mein Vorschlag für Variante 1:
    Als sortierbaren Wert nehme ich die IP-Adresse aber alle Teile sind immer 3 Stellen lang (mit 0 aufgefüllt):

  • Hier noch meine 2Cents :)

  • So wollte mich mal wieder melden, bin leider noch nicht so ganz weitergekommen, werde noch wahnsinnig darüber;) Vielen Dank noch mal für die vielen Ansätzte.

    @Aspirin: Das mit der plus udf finde ich ganz interessant, das Problem ist nur wo und an welcher Stelle sollte ich dies einabuen, die Listview kann ich ja anscheinend nicht damit auslesen. Brauche ich dazu noch die Standard Array.udf? Oder soltle ich besser die Sortierfunktionalitär in ie WM Notify eibauen? oder behindert das wieder die normale Funktionalität mit dem Sortieren auf den Spaltenkopf?

    Ich habe noch mal mein Script was nun sonst 99%ig funktioniert zusammengestellt.

    Vielen Dank noch mal und

    einen schönen Rest Sonntag

    Einmal editiert, zuletzt von casi4712 (7. Juli 2024 um 18:25)