Sort

Ordnet den Inhalt einer Variable in alphabetischer, numerischer oder zufälliger Reihenfolge (entfernt optional Duplikate).

Sort, VarName , Optionen

Parameter

VarName

Name der Variable, deren Inhalt geordnet werden soll. Dieser Parameter kann kein Ausdruck sein.

Optionen

Siehe untere Liste.

Optionen

Eine Zeichenkette mit null oder mehreren der folgenden Buchstaben (in beliebiger Reihenfolge, optional mit Leerzeichen getrennt):

C: Nach Groß- und Kleinschreibung sortieren (wird ignoriert, sobald die N-Option vorhanden ist). Fehlt sowohl C als auch CL, werden die Großbuchstaben von A bis Z und die entsprechenden Kleinbuchstaben beim Sortieren als gleichwertig angesehen.

CL [v1.0.43.03+]: Sortierung basiert auf dem aktuellen Gebietsschema des Benutzers, ohne Unterscheidung zwischen Groß- und Kleinschreibung. Zum Beispiel würden die meisten englischen und westeuropäischen Gebietsschemen die Großbuchstaben von A bis Z, einschließlich ANSI-Zeichen wie Ä und Ü, und die entsprechenden Kleinbuchstaben als gleichwertig ansehen. Diese Methode verwendet zudem eine "Wortsortierung" - Bindestriche und Apostrophe werden so behandelt, dass Wörter wie "coop" und "co-op" zusammen bleiben. Je nach Inhalt der zu sortierenden Elemente ist die Performance ein- bis achtmal schlechter als die Standardsortierung.

Dx: Ersetzen Sie x mit einem Trennzeichen, das in VarName Anfang und Ende aller Elemente bestimmt. Fehlt diese Option, ist x standardmäßig ein LF-Zeichen (`n), um den Inhalt von VarName korrekt zu sortieren, wenn dessen Zeilen entweder mit LF (`n) oder CR+LF (`r`n) enden.

F MeineFunktion [v1.0.47+]: Ermöglicht benutzerdefinierte Sortierung in Bezug auf die Kriterien in MeineFunktion (allerdings dauert diese Sortierung viel länger). Geben Sie den Buchstaben F, beliebig viele Leer-/Tabulatorzeichen und den Namen einer Funktion an, um jeweils zwei Elemente in der Liste benutzerdefiniert zu vergleichen. Die Funktion muss zwei oder drei Parameter akzeptieren. Geht die Funktion davon aus, dass der erste Parameter größer als der zweite ist, sollte sie einen positiven Integer zurückgeben. Geht die Funktion davon aus, dass die zwei Parameter gleich groß sind, sollte sie eine 0, "" oder nichts zurückgeben. Ansonsten sollte sie einen negativen Integer zurückgeben. Falls ein Dezimalpunkt im Rückgabewert vorhanden ist, wird dieser Teil ignoriert (z. B. ist 0.8 das gleiche wie 0). Ist der dritte Parameter vorhanden, erhält er den Offset (in Zeichen) vom ersten zum zweiten Element aus der originalen/unsortierten Liste (siehe Beispiele). Die Funktion verwendet die gleichen globalen Einstellungen (z. B. StringCaseSense) wie der Sort-Befehl, der sie aufgerufen hat.

Hinweis: Die F-Option bewirkt, dass alle anderen Optionen außer D, Z und U ignoriert werden (allerdings haben N, C und CL immer noch Einfluss darauf, wie Duplikate erkannt werden). Zudem erfolgt keine Sortierung, wenn die angegebene Funktion: 1) nicht existiert; 2) weniger als zwei Parameter akzeptiert; oder 3) im ersten oder zweiten Parameter ByRef hat.

N: Numerische Sortierung: Jedes Element wird als Zahl statt als Zeichenkette angesehen (fehlt diese Option beispielsweise, wird Zeichenkette 233 aufgrund alphabetischer Reihenfolge kleiner als Zeichenkette 40 angesehen). Sowohl dezimale als auch hexadezimale Zeichenketten (z. B. 0xF1) gelten als numerisch. Zeichenketten, die nicht mit einer Zahl beginnen, werden beim Sortieren als 0 angesehen. Zahlen werden als 64-Bit-Gleitkommawerte behandelt, damit die Nachkommastelle jeder Zahl (falls vorhanden) berücksichtigt wird.

Pn: Sortiert Elemente, basierend auf die Zeichenposition n (n muss ein Integer sein). Fehlt diese Option, ist n standardmäßig 1 - also die Position des ersten Zeichens. Die Sortierung vergleicht jede Zeichenkette mit anderen Zeichenketten, beginnend beim n-ten Zeichen. Wenn n größer als die Länge der Zeichenkette ist, wird sie beim Sortieren als leer angesehen. In Verbindung mit der N-Option (numerische Sortierung) wird die Zeichenposition der Zeichenkette verwendet, das nicht unbedingt das gleiche ist wie die Ziffernposition der Zahl.

R: Sortiert in umgekehrter Reihenfolge (alphabetisch oder numerisch, abhängig von den anderen Optionen).

Random: Sortiert in zufälliger Reihenfolge. Diese Option bewirkt, dass alle anderen Optionen außer D, Z und U ignoriert werden (allerdings haben N, C und CL immer noch Einfluss darauf, wie Duplikate erkannt werden). Beispiele:

Sort, MeineVar, Random
Sort, MeineVar, Random Z D|

U: Entfernt doppelte Elemente von der Liste, sodass jedes Element einzigartig ist. ErrorLevel wird auf die Anzahl der entfernten Elemente gesetzt (0, falls keine entfernt wurden). Ist die C-Option aktiv, müssen auch die Groß- und Kleinschreibungen der Elemente gleich sein, damit diese als identisch angesehen werden. Ist die N-Option aktiv, wird ein Element wie z.B. 2 als Duplikat von 2.0 angesehen. Wenn entweder die Pn- oder \-Option aktiv ist, muss das ganze Element ein Duplikat sein, nicht nur die Teilzeichenkette, die für die Sortierung verwendet wird. Wenn die Random- oder F/Funktion-Option aktiv ist, werden Duplikate nur entfernt, wenn sie nach dem Sortieren direkt aneinander angrenzen. Zum Beispiel könnte das Ergebnis beim zufälligen Sortieren von "A|B|A" entweder ein oder zwei A's enthalten.

Z: Um diese Option zu verstehen, wird eine Variable in Erwägung gezogen, die die Zeichenkette ROT`nGRÜN`nBLAU`n enthält. Fehlt die Z-Option, wird das letzte LF-Zeichen (`n) als Teil des letzten Elements angesehen (somit sind es nur 3 Elemente). Ist Z vorhanden, dient das letzte LF-Zeichen (falls vorhanden) dazu, ein leeres Element am Ende der Liste abzugrenzen (somit sind es 4 Elemente).

\: Sortiert Elemente, basierend auf die Teilzeichenkette, die jeweils nach dem letzten umgekehrten Schrägstrich erfolgt. Wenn das Element keinen umgekehrten Schrägstrich hat, wird das ganze Element als Teilzeichenkette angesehen. Diese Option ist nützlich, um Dateinamen ohne Rücksicht auf ihre Pfade zu sortieren. Im folgenden Beispiel steht AAA.txt über BBB.txt, weil ihre Verzeichnisse beim Sortieren ignoriert wurden:

C:\BBB\AAA.txt
C:\AAA\BBB.txt

Hinweis: Die Optionen N und P werden ignoriert, wenn die \-Option vorhanden ist.

Bemerkungen

Mit diesem Befehl wird üblicherweise eine Variable sortiert, die eine Liste mit Zeilen enthält, bei der jede Zeile mit einem Zeilenumbruchszeichen (`n) endet. Eine Möglichkeit, mehrere Zeilen in eine Variable zu bekommen, ist das Laden einer ganzen Datei via FileRead.

Falls VarName das Wort Clipboard ist und die Zwischenablage Dateien enthält (z. B. von einem offenen Explorer-Fenster kopiert), werden solche Dateien mit einer sortierten Liste ihrer Dateinamen ersetzt. Das heißt, dass die Zwischenablage nach dieser Operation nicht länger die Dateien selbst enthält.

ErrorLevel wird nur durch diesen Befehl geändert, wenn die U-Option aktiv ist.

Die maximale Kapazität einer Variable kann mit #MaxMem erhöht werden.

Wenn eine große Variable sortiert wurde und ihr Inhalt später nicht mehr benötigt wird, kann ihr Speicher freigegeben werden, indem man sie leer macht (z. B. MeineVar =).

Siehe auch

FileRead, Datei-lesende Schleife, Parsende Schleife, StringSplit, RegisterCallback(), Clipboard, #MaxMem

Beispiele

MeineVar = 5,3,7,9,1,13,999,-4
Sort MeineVar, N D,  ; Numerisch sortieren und Komma als Trennzeichen verwenden.
MsgBox %MeineVar%   ; Das Ergebnis ist -4,1,3,5,7,9,13,999

; Das folgende Beispiel sortiert den Inhalt einer Datei:
FileRead, Inhalt, C:\Adressenliste.txt
if not ErrorLevel  ; Erfolgreich geladen.
{
    Sort, Inhalt
    FileDelete, C:\Adressenliste (alphabetisch).txt
    FileAppend, %Inhalt%, C:\Adressenliste (alphabetisch).txt
    Inhalt =  ; Gibt den Speicher frei.
}

; Das folgende Beispiel macht WIN+C zu einem Hotkey, um Dateien von einem
; Explorer-Fenster zu kopieren und die sortierten Dateinamen in die Zwischenablage einzufügen:
#c::
Clipboard = ; Muss leer sein, damit die Erkennung funktioniert.
Send ^c
ClipWait 2
if ErrorLevel
    return
Sort Clipboard
MsgBox Bereit zum Einfügen:`n%Clipboard%
return

; Die folgenden Beispiele demonstrieren die benutzerdefinierte Sortierung mit einer Callback-Funktion.
MeineVar = def`nabc`nmno`nFGH`nco-op`ncoop`ncop`ncon`n
Sort, MeineVar, F StringSort
StringSort(a1, a2)
{
    return a1 > a2 ? 1 : a1 < a2 ? -1 : 0  ; Sortiert alphabetisch, basierend auf die Einstellung von StringCaseSense.
}

MeineVar = 5,3,7,9,1,13,999,-4
Sort, MeineVar, F IntegerSort D,
IntegerSort(a1, a2)
{
    return a1 - a2  ; Sortiert in aufsteigender numerischer Reihenfolge.  Diese Methode funktioniert nur, wenn die Differenz einen vorzeichenfähigen 64-Bit-Integer nicht überschreiten kann.
}

MeineVar = 1,2,3,4
Sort, MeineVar, F UmgekehrteRichtung D,  ; Kehrt die Liste um, so dass sie 4,3,2,1 enthält.
UmgekehrteRichtung(a1, a2, offset)
{
    return offset  ; Offset ist positiv, wenn in der originalen Liste a2 nach a1 kommt; ansonsten negativ.
}