Shown here is a sort routine that utilizes the built in Command Line sort function. Outside of this routine, a file is loaded into a Textbox and the file name is saved in "m_Filename". The user is first asked where in each line the sort is to start. I use this routine to sort log files, which often begin with a time stamp. The file is appended chronologically, so it is already sorted by time. For example:
00:03:14 Request from 74.125.80.70 for TXT-record for _adsp._domainkey.yellowhead.com.
00:03:15 Sending reply to 74.125.80.70 about TXT-record for _adsp._domainkey.yellowhead.com.:
00:03:16 -> Header: Name does not exist!
I am only interested in the "Request" part of it, so I would start at position 25. I can then easily delete the unwanted portions.
The sorted file is temporarily stored in the users "Temp" directory. You will probably find lots of junk in that directory, as many programs are not very good at cleaning up after themselves. We will attempt not to be one of those, and "Kill" off the file after we are done with it.
The heart of the routine is the "Shell" function. In that I use the seldom used "Environ" function to recover the "COMSPEC" string from the Environment. Environment variables will vary with the individual computer, and can be viewed from the Command Prompt with the "Set" command. To this I add "/c" to concatenate, the "type" command, the file name to sort, the pipe option (|), the "sort" command, and the name of the file to direct the output to. I also add a "vbHide" option, since we are not interested in displaying the results in a Command Prompt window.
We then enter a loop waiting for the directory to be updated. To prevent getting stuck in an endless loop, a counter is implemented. Since file I/O is a buffered operation, an additional 100 ms delay is added to allow for the write operation to complete. The "Loadfile" routine loads the newly sorted file back into the Textbox. We use another 100 ms delay to allow that operation to complete before we delete the temporary file. We then restore the App.Path and the original file name.
I have found this routine to be a lot faster than any algorithm I could put together in VB6, especially for large text files. For the most part it is an in-memory sort, but for very large files it will temporarily store the first run to the disk before attempting the second run. An example of how to use this routine will be forthcoming in the near future.
J.A. Coutts
00:03:14 Request from 74.125.80.70 for TXT-record for _adsp._domainkey.yellowhead.com.
00:03:15 Sending reply to 74.125.80.70 about TXT-record for _adsp._domainkey.yellowhead.com.:
00:03:16 -> Header: Name does not exist!
I am only interested in the "Request" part of it, so I would start at position 25. I can then easily delete the unwanted portions.
The sorted file is temporarily stored in the users "Temp" directory. You will probably find lots of junk in that directory, as many programs are not very good at cleaning up after themselves. We will attempt not to be one of those, and "Kill" off the file after we are done with it.
The heart of the routine is the "Shell" function. In that I use the seldom used "Environ" function to recover the "COMSPEC" string from the Environment. Environment variables will vary with the individual computer, and can be viewed from the Command Prompt with the "Set" command. To this I add "/c" to concatenate, the "type" command, the file name to sort, the pipe option (|), the "sort" command, and the name of the file to direct the output to. I also add a "vbHide" option, since we are not interested in displaying the results in a Command Prompt window.
We then enter a loop waiting for the directory to be updated. To prevent getting stuck in an endless loop, a counter is implemented. Since file I/O is a buffered operation, an additional 100 ms delay is added to allow for the write operation to complete. The "Loadfile" routine loads the newly sorted file back into the Textbox. We use another 100 ms delay to allow that operation to complete before we delete the temporary file. We then restore the App.Path and the original file name.
Code:
Private Sub mnuSort_Click()
Dim sTmp As String
Dim lCntr As Long
Dim SortStart As Long
Dim SortCmd As String
If Len(m_Filename) = 0 Then
MsgBox "Text must be saved as a file before it can be sorted!", vbExclamation
Exit Sub
End If
SortStart = InputBox("Enter character count to start at - ", "Start", 0)
If SortStart = 0 Then
SortCmd = "|sort>tmpsort.txt" 'Default starts at beginning of line
Else
SortCmd = "|sort /+" & CStr(SortStart) & ">tmpsort.txt"
End If
ChDir TmpPath 'Sorted file is output to temp path
sTmp = m_Filename 'Save current file location
Debug.Print Timer
Call Shell(Environ("COMSPEC") & " /c type " & m_Filename & SortCmd, vbHide)
m_Filename = "tmpsort.txt" 'Change filename to sorted file
Do Until Dir(m_Filename) = m_Filename 'Wait for directory to be updated
DoEvents
Sleep 10
lCntr = lCntr + 1
If lCntr > 100 Then GoTo SortErr
Loop
Debug.Print lCntr
Sleep 100 'Wait an additional 100 ms for file write to complete
Debug.Print Timer
LoadFile 'Load sorted file to Textbox
Sleep 100 'Wait an additional 100 ms for sorted file to load
Kill m_Filename
Debug.Print Timer
m_Filename = sTmp 'Restore original filename
ChDir App.Path 'Restore Application path
m_Flg1 = True 'Set change flag
Exit Sub
SortErr:
MsgBox "Sort Timed out!"
End Sub
Private Const MAX_PATH = 260
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Function GetTmpPath() As String
Dim sFolder As String ' Name of the folder
Dim lRet As Long ' Return Value
sFolder = String(MAX_PATH, 0)
lRet = GetTempPath(MAX_PATH, sFolder)
If lRet <> 0 Then
GetTmpPath = Left(sFolder, InStr(sFolder, Chr(0)) - 1)
Else
GetTmpPath = vbNullString
End If
End Function
J.A. Coutts