's and with more options.
sorts by SortColumn and all-after SortColumn and i think this is better sorting.
The iterations are 100.000 so be patient to finish.
Code: Select all
#NoEnv
SetBatchLines, -1
Var =
(
foo6,bar8,foo2,bar7,foo3,2016/05/30,bar2
foo3,bar7,foo5,bar2,foo6,2016/05/30,bar1
foo1,bar2,foo4,bar5,foo2,2016/05/27,bar2
foo8,bar5,foo6,bar4,foo4,2016/05/30,bar4
foo7,bar4,foo3,bar6,foo3,2016/05/30,bar3
foo2,bar6,foo1,bar8,foo2,2016/05/27,bar1
foo5,bar3,foo8,bar1,foo6,2016/05/30,bar5
foo4,bar1,foo7,bar3,foo8,2016/05/23, bar
)
I := 100000
S := A_TickCount
Loop, %I% {
V := Var
Sorted := SortByColumn(V, 6)
}
T1 := A_TickCount - S
MsgBox, 4096, SortByColumn, %T1% ms for %I% iterations:`n`n%Sorted%
S := A_TickCount
Loop, %I% {
V := Var
Sorted := ColumnSort(V, 6)
}
T2 := A_TickCount - S
MsgBox, 4096, ColumnSort, %T2% ms for %I% iterations:`n`n%Sorted%
S := A_TickCount
Loop, %I% {
Sorted := Var
Sort, Sorted, F newpieSort
}
T3 := A_TickCount - S
MsgBox, 4096, newpieSort, %T3% ms for %I% iterations:`n`n%Sorted%
MsgBox, 4096, FINAL for %I% iterations, SortByColumn:%A_Tab%%T1% ms`nColumnSort:%A_Tab%%T2% ms`nnewpieSort:%A_Tab%%T3% ms
ExitApp
SortByColumn(Str, SortCol, SortOptions="", ColSep="`,", RowSep="`n", RowOmitChars="") {
IfEqual,SortCol,1,Sort,Str,D%RowSep% %SortOptions%
IfEqual,SortCol,1,Return Str
BS:=Chr(8), AA:=BB:=""
Loop, parse, Str, %RowSep%, %RowOmitChars%
p:=InStr(A_LoopField,ColSep,false,1,SortCol-1)
,AA.=SubStr(A_LoopField,(p=0?1:p+1)) BS A_LoopField RowSep
Sort, AA, D%RowSep% %SortOptions%
Loop, parse, AA, %RowSep%
BB.=SubStr(A_LoopField,InStr(A_LoopField,BS)+1) RowSep
Return RTrim(BB, RowSep)
}
ColumnSort(Var, Column, Separator := ",", SortOptions := "") {
Static BS := Chr(8)
VarSetCapacity(SortIn, StrLen(Var) * 2)
Loop, Parse, Var, `n
SortIn .= StrSplit(A_LoopField, Separator)[Column] . BS . A_LoopField . "`n"
Sort, SortIn, %SortOptions%
VarSetCapacity(SortOut, StrLen(SortIn))
Loop, Parse, SortIn, `n
SortOut .= SubStr(A_LoopField, InStr(A_LoopField, BS) + 1) . "`n"
Return RTrim(SortOut, "`r`n")
}
newpieSort(item1, item2)
{
date1 := StrSplit(item1, ",")[6]
date2 := StrSplit(item2, ",")[6]
return date1 > date2 ? 1 : date1 < date2 ? -1 : 0
}
Code: Select all
SortByColumn(Str, SortCol, SortOptions="", ColSep="`,", RowSep="`n", RowOmitChars="") {
IfEqual,SortCol,1,Sort,Str,D%RowSep% %SortOptions%
IfEqual,SortCol,1,Return Str
BS:=Chr(8), AA:=BB:=""
Loop, parse, Str, %RowSep%, %RowOmitChars%
p:=InStr(A_LoopField,ColSep,false,1,SortCol-1)
,AA.=SubStr(A_LoopField,(p=0?1:p+1)) BS A_LoopField RowSep
Sort, AA, D%RowSep% %SortOptions%
Loop, parse, AA, %RowSep%
BB.=SubStr(A_LoopField,InStr(A_LoopField,BS)+1) RowSep
Return RTrim(BB, RowSep)
} ; sorts by SortCol and all-after SortCol https://autohotkey.com/boards/viewtopic.php?f=5&t=18643&p=90570#p90570