array sortieren

  • Hallo AutoIt-Gemeinde

    ich komm mit dem
    _arraysort irgendwie nicht klar, hab mal ein kleines Beispiel gehackt.
    Die Geburtstagsliste ist kommentiert, muß natürlich als Datei da sein,
    bei mir als "f:\eigenes\swe\autoit\tryarea\Geburtstagsliste.txt"

    Wie kann ich das Array $tabelle nach Vornamen bzw. Familiennamen sortieren.

    Arbeite da an einem kompleren Tool und will ein superelegantes Suchmenü programmieren, da muß ich eine Tabelle dynamisch einlesen und nach div. Kriterien sortieren können.

    Es dankt Euch

    German

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; sortieren

    [/autoit] [autoit][/autoit] [autoit]

    #include <array.au3>
    #include <file.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    ; Geburtstagsliste
    15.11.1958 Renate Schmitt
    10.01.1973 Getraude Schuffelmaus
    27.11.1942 Werner Schnorrkopf
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    $gebliste="f:\eigenes\swe\autoit\tryarea\Geburtstagsliste.txt"

    [/autoit] [autoit][/autoit] [autoit]

    ; einlesen in ein eindim. Array
    Dim $lRead2
    _FileReadtoArray($gebliste, $lRead2)
    _arraydisplay($lRead2,"xx")
    _ArraySort ($lRead2)
    _arraydisplay($lRead2,"lRead2 sortiert")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Dim $lRead
    _FileReadToArray($gebliste, $lRead )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Dim $tabelle[$lRead[0]][3]

    [/autoit] [autoit][/autoit] [autoit]

    For $lNum = 1 to $lRead[0]
    $aWerte = StringSplit($lRead[$lNum]," ")
    if $aWerte[0]=3 then
    For $i=1 To UBound($aWerte)-1
    msgbox(0,"des ist", $aWerte[$i])
    $tabelle[$lNum-1][$i-1]=$aWerte[$i]
    Next
    EndIf
    Next
    _arraydisplay($tabelle,"xx")

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    So wird ein Schuh draus:

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $file = 'test.txt'
    Dim $ar, $arSortable[1][3], $var

    [/autoit] [autoit][/autoit] [autoit]

    _FileReadToArray($file, $ar)
    If @error Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($ar, 'unsortiert - 1D Array')
    ReDim $arSortable[$ar[0]][3]
    For $i = 1 To UBound($ar) -1
    $var = StringSplit($ar[$i], ' ')
    If IsArray($var) Then
    $arSortable[$i-1][0] = $var[1] ; Geb.Dat.
    $arSortable[$i-1][1] = $var[2] ; Vorname
    $arSortable[$i-1][2] = $var[3] ; Name
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($arSortable, 'vor der Sortierung')
    _ArraySort($arSortable, Default,0,0,3,1)
    _ArrayDisplay($arSortable, 'sortiert nach Vorname')
    _ArraySort($arSortable, Default,0,0,3,2)
    _ArrayDisplay($arSortable, 'sortiert nach Name')

    [/autoit]
  • Hallo Bug-Fix!

    erstmal DANKE, eine Sache funktioniert nicht und zwar das

    If IsArray($var) then..

    da steigt der beim einlesen der letzten Zeile irgendwie aus, hab jetzt einfach noch einen Filter rumgelegt, wenn nicht ein 3 Teiliger Wert aus dem 1D-Arry kommt.

    Wollt das jetzt noch besser machen, mit ner eigenen Schleife auf das Array $ar, wenn der Wert nicht 3-teilig, dann _arraydelete($ar,$i) nur das funktioniert gar nicht (die test.txt wird bei mir "manuell" von mehreren Leuten editiert, wenn da ein Schrott drin ist, dann soll er das gleich komplett aus dem Array werfen)
    ==============
    warum geht das nicht
    For $i = 1 To UBound($ar) -1
    $var = StringSplit($ar[$i], ' ')
    if $var[0] <> 3 then ; schrottwert in der zeile
    _arraydelete($ar,$i) ; raus damit
    EndIf
    Next
    ====================


    so gehts jetzt (den Filter, der nicht funktioniert, wollte ich einfach voher laufen lassen.


    For $i = 1 To UBound($ar) -1
    $var = StringSplit($ar[$i], ' ')
    if $var[0]=3 then
    ; msgbox(0,"erster Wert", $var[1])

    If IsArray($var) Then
    $arSortable[$i-1][0] = $var[1] ; Geb.Dat.
    $arSortable[$i-1][1] = $var[2] ; Vorname
    $arSortable[$i-1][2] = $var[3] ; Name
    EndIf
    EndIf
    Next


    Danke & Gruss aus dem Spessart

    German

    • Offizieller Beitrag

    Du kannst es doch gleich in einer Abfrage regeln:

    Spoiler anzeigen
    [autoit]

    ReDim $arSortable[$ar[0]][3]
    For $i = 1 To UBound($ar) -1
    $var = StringSplit($ar[$i], ' ')
    If IsArray($var) And $var[0] = 3 Then ; hier gleich auf korrekte Anzahl prüfen
    $arSortable[$i-1][0] = $var[1] ; Geb.Dat.
    $arSortable[$i-1][1] = $var[2] ; Vorname
    $arSortable[$i-1][2] = $var[3] ; Name
    EndIf
    Next

    [/autoit]


    Falls einige Einträge dadurch rausfallen hast du im 2D-Array ein paar leere Einträge, die kannst du aber auch noch entfernen. Funktion siehe in meiner Signatur.