Sortierung mit _ArraySort falsch

  • Hallo

    Ich habe ein Problem mit der Sortierung eines Array:
    Wenn ich die Datei Eingabe.txt sortiere kommt Ausgabe.txt heraus welches aber falsch sortiert ist ...
    Alle Programme wie Editoren und Excel sortieren wie Eingabe.txt ...
    Warum sortiert Autoit anders?
    Oder hab ich da irgendwo einen Denkfehler.
    Bitte um Hilfe
    Vielen Dank schon mal in Vorraus
    WindWind12

    Eingabe.txt
    'Abandon' Tracking Disruptor I
    125mm Light 'Scout' Autocannon I
    125mm Light Carbine Repeating Cannon I
    Armor EM Hardener I
    Medium 'Gremlin' Power Core Disruptor I
    Medium 'Vehemence' I Shockwave Charge
    Medium Afocal Pulse Maser I
    Medium F-4a Ld-Sulfate I Capacitor Charge Unit
    Medium F-S9 Regolith Shield Induction
    Medium Warp Core Optimizer II
    N-Type Explosive Hardener I
    Neutron Blaster Cannon I
    X-Large Ship Assembly Array
    XR-3200 Heavy Missile Bay

    Ausgabe.txt
    125mm Light Carbine Repeating Cannon I
    125mm Light 'Scout' Autocannon I
    'Abandon' Tracking Disruptor I
    Armor EM Hardener I
    Medium Afocal Pulse Maser I
    Medium F-4a Ld-Sulfate I Capacitor Charge Unit
    Medium F-S9 Regolith Shield Induction
    Medium 'Gremlin' Power Core Disruptor I
    Medium 'Vehemence' I Shockwave Charge
    Medium Warp Core Optimizer II
    Neutron Blaster Cannon I
    N-Type Explosive Hardener I
    X-Large Ship Assembly Array
    XR-3200 Heavy Missile Bay

    [autoit]


    #include <array.au3>
    #include <file.au3>
    $Eingabe = @ScriptDir & "\Eingabe.txt"
    $Ausgabe = @ScriptDir & "\Ausgabe.txt"

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

    LogSortieren($Eingabe,$Ausgabe)
    Exit

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

    Func LogSortieren($Eingabe,$Ausgabe)
    Dim $Daten, $File
    Dim $Zeile[1]
    ;Einlesen
    $File = FileOpen($Eingabe, 0)
    If $File = -1 Then MSGBOX(0,"","Error: LogSortieren")

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

    For $i = 1 To 500
    $Daten = FileReadLine($File,$i)
    If @error = -1 Then
    If $Daten <> "" then _ArrayAdd($Zeile,$Daten)
    ExitLoop
    Else
    If $Daten <> "" then _ArrayAdd($Zeile,$Daten)
    ;msgbox (0,"","!" & $Daten & "!")
    EndIf
    Next
    FileClose($Eingabe)

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

    ;Array sortieren
    _ArraySort($Zeile)
    ;_ArrayDisplay($Zeile)

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

    ;schreiben
    $File = FileOpen($Ausgabe, 1)
    For $i = 1 To UBound($Zeile)-1
    FileWrite($File,$Zeile[$i] & @CRLF)
    Next
    FileClose($Ausgabe)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von windwind12 (22. Januar 2011 um 02:57) aus folgendem Grund: Beispiel erweitert

  • Falsch Sortiert würde ich nicht sagen. Halst "anders".
    Ich kann mich jetzt täuschen aber das Problem ist nicht primär _arraySort() sondern StringCompare().
    Ich befürchte, für eine andere Sortierung braucht's eine eigene Funktion.

    Dein Skript lässt sich übrigens um einiges verkürzen.

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <file.au3>
    $sEingabe = @ScriptDir & "\Eingabe.txt"
    $sAusgabe = @ScriptDir & "\Ausgabe.txt"

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

    LogSortieren($sEingabe, $sAusgabe)
    Exit

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

    Func LogSortieren($sEingabe, $sAusgabe)
    Dim $aDaten
    ;Einlesen
    _FileReadToArray($sEingabe, $aDaten)
    ;Array sortieren
    _ArraySort($aDaten, 0, 1)
    ;_ArrayDisplay($aDaten)
    ;schreiben
    _FileWriteFromArray($sAusgabe, $aDaten, 1)
    EndFunc ;==>LogSortieren

    [/autoit]

    edit: Versuch's mal so.

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <file.au3>
    $sEingabe = @ScriptDir & "\Eingabe.txt"
    $sAusgabe = @ScriptDir & "\Ausgabe.txt"

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

    LogSortieren($sEingabe, $sAusgabe)
    Exit

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

    Func LogSortieren($sEingabe, $sAusgabe)
    Dim $aDaten
    ;Einlesen
    _FileReadToArray($sEingabe, $aDaten)
    ;Array sortieren
    ArraySort($aDaten, 0, 1)
    _ArrayDisplay($aDaten)
    ;schreiben
    _FileWriteFromArray($sAusgabe, $aDaten, 1)
    EndFunc ;==>LogSortieren

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

    Func ArraySort(ByRef $avArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
    If Not IsArray($avArray) Then Return SetError(1, 0, 0)
    Local $iUBound = UBound($avArray) - 1
    If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
    If $iStart < 0 Then $iStart = 0
    If $iStart > $iEnd Then Return SetError(2, 0, 0)
    If $iEnd <= $iStart Then Return
    Local $vTmp
    If ($iEnd - $iStart) < 15 Then
    Local $vCur
    For $i = $iStart + 1 To $iEnd
    $vTmp = $avArray[$i]
    If IsNumber($vTmp) Then
    For $j = $i - 1 To $iStart Step -1
    $vCur = $avArray[$j]
    ; If $vTmp >= $vCur Then ExitLoop
    If ($vTmp >= $vCur And IsNumber($vCur)) Or (Not IsNumber($vCur) And StringCompare($vTmp, $vCur, 1) >= 0) Then ExitLoop
    $avArray[$j + 1] = $vCur
    Next
    Else
    For $j = $i - 1 To $iStart Step -1
    If (StringCompare($vTmp, $avArray[$j], 1) >= 0) Then ExitLoop
    $avArray[$j + 1] = $avArray[$j]
    Next
    EndIf
    $avArray[$j + 1] = $vTmp
    Next
    Return
    EndIf
    Return 1
    EndFunc ;==>ArraySort

    [/autoit]