Posts: 360
Threads: 36
Joined: Mar 2023
Reputation:
28
Happy holidays. I've sniffed around the site and can't find an alphabetizing routine. I doesn't have to be fast - I just need it to reorder some short files holding song titles. Any ideas for a guy looking for a simple sorter? Thanks!
Posts: 4,698
Threads: 222
Joined: Apr 2022
Reputation:
322
And for variable length strings in an array called sa$() (sa=String Array):
Code: (Select All)
DefLng A-Z
Const nItems = 1000000
ReDim Shared sa$(1 To nItems) 'setup with string array sa$() shared so dont have to pass as parameter
For x = 1 To nItems ' make a random list to sort
b$ = ""
r = (Rnd * 5) \ 1 + 2
For i = 0 To r
b$ = b$ + Mid$("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.?", (Rnd * 64) \ 1 + 1, 1)
Next
sa$(x) = b$
Print b$,
Next
Print
Print "Press any to sort"
Sleep
t## = Timer(.01)
QSort 1, nItems
time## = Timer(.01) - t##
Cls
For i = 1 To nItems
Print sa$(i),
Next
Print
Print "time:"; time##
' modified for QB64 from JB
' This is the best all purpose sort routine around, don't worry how it works, it just does!
' To use this sub rountine store all the string values you want to sort into sa$() array
' call Qsort with Start = 1 and Finish = number of Items in your array
Sub QSort (Start, Finish) 'sa$ needs to be DIM SHARED !!!! array
Dim i As Long, j As Long, x$
i = Start
j = Finish
x$ = sa$(Int((i + j) / 2))
While i <= j
While sa$(i) < x$
i = i + 1
Wend
While sa$(j) > x$
j = j - 1
Wend
If i <= j Then
Swap sa$(i), sa$(j)
i = i + 1
j = j - 1
End If
Wend
If j > Start Then QSort Start, j
If i < Finish Then QSort i, Finish
End Sub
724 855 599 923 575 468 400 206 147 564 878 823 652 556 bxor cross forever
Posts: 902
Threads: 38
Joined: Apr 2022
Reputation:
72
If I was still trying to peddle PowerShell scripts, I'd say use a text file and have PowerShell sort it for you and put it into a sorted file to be read. Or, use a file and have PowerShell output to stdout and use pipecom to read it in.
The noticing will continue
Posts: 902
Threads: 38
Joined: Apr 2022
Reputation:
72
12-21-2023, 07:46 PM
(This post was last modified: 12-21-2023, 07:59 PM by SpriggsySpriggs.)
For working in PowerShell:
I have formatted them as if you are running it from inside a SHELL call in QB64. The carets (^) are needed to escape the pipe (|) characters. If you are running it already in PowerShell, you would get rid of "PowerShell -NoProfile" and the carets.
If you want the directory listing of all text files sorted (PowerShell):
Quote:PowerShell -NoProfile Get-ChildItem -Filter *.txt ^| Select Name -ExpandProperty Name ^| Sort-Object > sorted.txt
If you already have a file with content inside of it (PowerShell):
Quote:PowerShell -NoProfile Get-Content -Path examplefile.txt ^| Sort-Object > sorted.txt
P.S
The "-NoProfile" switch is necessary for PowerShell because there are profile scripts that are loaded when it is started that slow down execution considerably. "-NoProfile" tells it to ignore user settings which speeds up the call.
P.P.S
The redirect to sorted.txt is only necessary if you are not using pipecom. Without pipecom, you won't have access to the direct stdout handle. With it, you would remove that redirect and just grab the raw stdout from the call.
The noticing will continue