Sort

変数の内容を特定の順番に並び替える。文字列としての処理のほかに、数値としての処理も可能。

Sort, VarName [, Options]

Parameters

引数名説明
VarName 対象となるデータを格納した変数名。この変数の内容が並び替えられ、この変数に格納される。
Options 後述するオプションを半角スペース区切りで列挙。

Options

C
文字列として比較する場合に、大文字小文字を区別する
CL
現在のユーザーのロケール設定に沿って大文字小文字の違いを無視する。
日本語環境の場合、全角のアルファベットなども対象となる。
Dx
xに要素の区切り文字を指定する。省略時は改行コードLF(`n)。
F FunctionName
指定した関数を使って比較を行う。
FunctionNameに比較を行う関数の名前を指定する。
関数は、2つもしくは3つの引数を受け取り、第1引数>第2引数なら正の値を、第1引数=第2引数なら0を、第1引数<第2引数なら負の値を返す。
関数が第3引数を受け取る場合、第1引数の文字列と第2引数の文字列の出現位置の差が与えられる。
「D」「Z」以外のオプションは無視される。(ただし、「U」オプションによる重複判定では、N、C、CLオプションに従った比較が行われる)
関数が0を返した項目同士の並び順は不定である。元の文字列内での並び順と同じ順番にするためには、第1引数と第2引数が等しい場合に第3引数の値の符号を逆にして返すようにすればいい。
N
各要素を数値として比較する。
16進数値や小数値も数値として扱われる。
先頭に数値として扱える部分があれば、その文字列は数値として扱われる。
数値で始まらない文字列は、「0」として扱われる。
Pn
最初の数文字を飛ばして、n番目の文字以降から比較に使用する。
省略時は、1文字目から比較される。
要素の長さがここで指定した文字数よりも小さい場合、その要素は空とみなされる。
Nオプションとともに使用された場合、n文字目以降の数値として扱える部分で比較される。
R
降順で並び替える。(大きい順)
Random
並び順をシャッフルする。
「D」「Z」以外のオプションは無視される。(ただし、「U」オプションによる重複判定では、N、C、CLオプションに従った比較が行われる)
U
ソート結果から重複を取り除く。
ErrorLevelに削除された項目数が格納される。

「N」オプションが指定された場合、「2」と「2.0」のように数値的に同じ項目は重複とみなされる。
「Random」オプションが指定された場合、シャッフル後に隣り合った項目だけが除去される。
Z
文字列の最後に区切り文字があったとき、その後に空要素が存在するものとみなす。
たとえば、「aaa`nbbbb`nccccc`n」という文字列を並び替えるとき、通常は3つの要素があるとみなされるが、このオプションを指定すると4要素とみなされる。
\
一番最後の「\」以降の文字列で比較される。
ファイルのフルパスのファイル名部分だけで比較したいときに使用する。
「\」を含まない要素は、要素全体で比較される。
このオプションを使用した場合、NオプションとPオプションは無視される。

Remarks

VarNameが「Clipboard」で、クリップボードの内容がExplorerなどでコピーしたファイル群だった場合、Sort実行後のクリップボードの内容はファイル名を改行区切りで列挙した文字列になってしまう。

VarNameに指定したものが環境変数だった場合、新たに同じ名前のスクリプト側の変数が作成され、そこに結果が格納される。
その後VarNameへのアクセスはスクリプト側の変数へのアクセスになってしまう。
下記の例のようにすれば、結果を環境変数に移して、アクセス先を環境変数に戻すことが出来る。

VarSort, MyEnvVar
EnvSet, MyEnvVar, %MyEnvVar%
MyEnvVar = ;スクリプト側の変数を空にすると、環境変数のほうが優先されるようになる

Related

StringSplit, parsing loop, clipboard

Example(s)

MyVar = 5,3,7,9,1,13,999,-4
Sort MyVar, N D,  ; Sort numerically, use comma as delimiter.
MsgBox %MyVar%   ; The result is -4,1,3,5,7,9,13,999

; This example makes Win+C a hotkey to copy files from an open
; Explorer window and put their sorted filenames onto the clipboard:
#c::
Clipboard = ; Must be blank for detection to work.
Send ^c
ClipWait 2
if ErrorLevel <> 0
	return
Sort Clipboard
MsgBox Ready to be pasted:`n%Clipboard%
return
; The following examples demonstrate custom sorting via a callback function.
MyVar = def`nabc`nmno`nFGH`nco-op`ncoop`ncop`ncon`n
Sort, MyVar, F StringSort
StringSort(a1, a2)
{
    return a1 > a2 ? 1 : a1 < a2 ? -1 : 0
}

MyVar = 5,3,7,9,1,13,999,-4
Sort, MyVar, F IntegerSort D,
IntegerSort(a1, a2)
{
    return a1 - a2  ; This method works only if the result never overflows a signed 64-bit integer.
}

MyVar = 1,2,3,4
Sort, MyVar, F ReverseDirection D,  ; Reverses the list so that it contains 4,3,2,1
ReverseDirection(a1, a2, offset)
{
    return offset  ; Offset is positive if a2 came after a1 in the original list; negative otherwise.
}