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: Die Sortierung erfolgt Groß-/Kleinschreibung-sensitiv (wird ignoriert, wenn die N-Option vorhanden ist). Lässt man sowohl C als auch CL weg, werden die Großbuchstaben A bis Z und die entsprechenden Kleinbuchstaben beim Sortieren gleichwertig behandelt.

CL [v1.0.43.03+]: Die Sortierung erfolgt nicht-Groß-/Kleinschreibung-sensitiv gemäß den aktuellen Sprach- und Regionseinstellungen des Benutzers. In den meisten englischen und westeuropäischen Regionen beispielsweise werden die Großbuchstaben A bis Z, einschließlich ANSI-Zeichen wie Ä und Ü, und die entsprechenden Kleinbuchstaben gleichwertig behandelt. Diese Methode verwendet zudem eine "Wortsortierung", die Bindestriche und Apostrophe so behandelt, dass Wörter wie "coop" und "co-op" zusammenbleiben. Je nach Inhalt der zu sortierenden Elemente ist die Leistung 1- bis 8-mal schlechter als die Standardmethode der Nichtsensitivität.

Dx: Ersetzen Sie x mit einem Trennzeichen, das in VarName Anfang und Ende aller Elemente bestimmt. Das Trennzeichen ist immer Groß-/Kleinschreibung-sensitiv. Wenn diese Option nicht vorhanden ist, ist x standardmäßig ein LF-Zeichen (`n). In den meisten Fällen funktioniert das auch, wenn Zeilen mit CR+LF (`r`n) enden, aber das CR-Zeichen (`r) wird bei Vergleichen mit einbezogen und dadurch die Sortierreihenfolge beeinflussen. Zum Beispiel wird B`r`nA wie erwartet sortiert, aber A`r`nA`t`r`nB platziert A`t`r vor A`r.

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 (wenn diese Option nicht vorhanden ist, wird zum Beispiel die 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-Floating-Point-Werte behandelt, um den eventuell vorhandenen Nachkommabereich jeder Zahl einzubeziehen.

Pn: Sortiert Elemente, basierend auf der Zeichenposition n (n muss ein Integer sein). Wenn diese Option nicht vorhanden ist, wird n standardmäßig 1 sein (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 As enthalten.

Z: Um diese Option zu verstehen, wird eine Variable in Erwägung gezogen, die die Zeichenkette ROT`nGRÜN`nBLAU`n enthält. Wenn die Z-Option nicht vorhanden ist, 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 der 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. Mit anderen Worten: Die Zwischenablage enthält nach dieser Operation nicht länger die Dateien selbst.

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 =).

FileRead, dateilesende Schleife, parsende Schleife, StrSplit(), RegisterCallback(), Clipboard, #MaxMem, StringSplit

Beispiele

Sortiert eine kommagetrennte Liste von Zahlen.

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

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.
}

Bringt einen Hotkey dazu, Dateien von einem Explorer-Fenster zu kopieren und die sortierten Dateinamen in die Zwischenablage einzufügen.

#c:: ; WIN+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

Demonstriert 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 der 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.
}