I would like a function to do the same as the strtok function under C. It should take a variable number of tokens (characters, could all be in one string just like strtok) to tokenize on. Each token should be a string.
eg:
' Tokenize based on command ',' and space ' '
strtok("Have a nice, day", " ,")
This should break the above string into :
"Have"
"a"
"nice"
"day"
'************************************************************
'Date: 06/08/1998
'Author: Anthony Cornetto
'Input:
' strResult()<String>: Array where results are returned
' strWorking<String>: String to parse
' strDelimiter<String>: Delimiter
'Output:
' <None>
'Purpose: Goes through string, separating it by the delimiter, and
' Returning the elements in an array.
'************************************************************
Public Sub SeparateString(strResult() As String, strWorking As String, strDelimiter As String)
'The separated strings are placed into an array.
Dim lngLastLoc As Long
Dim lngDelimLoc As Long
Dim lngFieldCount As Long
Dim intI As Integer
'clean out string
ReDim strResult(0 To 0) As String
If strWorking <> "" Then
'initialize last location to 0
lngLastLoc = 1
lngFieldCount = 0
lngDelimLoc = InStr(lngLastLoc, strWorking, strDelimiter)
'Continue until no more delimiters are found
Do Until lngDelimLoc = 0
'Set array size
If lngFieldCount > 0 Then
ReDim Preserve strResult(0 To lngFieldCount) As String
End If
'add last field (after delim)
If lngFieldCount > 0 Then
ReDim Preserve strResult(0 To lngFieldCount) As String
End If
strResult(lngFieldCount) = Mid$(strWorking, lngLastLoc)
End If
End Sub
anthonyc, that really does not mimic strtok. Here is one that does, including using static variables.
' Tokenize a string like 'strtok' in C std lib
' Does not modify source string like strtok.
Function StrTok(Seps As String, Optional SourceString As Variant) As String
Static LocalString As String
Static LocalCounter As Long ' Substitutes for pointer into string
Dim lCnt1 As Long
If Not (IsMissing(SourceString)) Then
LocalString = SourceString
LocalCounter = 1 ' Must start at first char.
End If
' If we start on a separator, skip all seps found.
While (LocalCounter <= Len(LocalString)) And (InStr(Seps, Mid$(LocalString, LocalCounter, 1))) <> 0
LocalCounter = LocalCounter + 1
Wend
'
lCnt1 = LocalCounter
' Count until separators found.
While (lCnt1 <= Len(LocalString)) And (InStr(Seps, Mid$(LocalString, lCnt1, 1)) = 0)
lCnt1 = lCnt1 + 1
Wend
Yeah, I noticed that. I guess it depends on what you are looking for. In writing VB parsers, I usually need to change the separators so I use the version I posted.
0
guava070998Author Commented:
Hi, thanks for the quick replies. I will try this out as soon as possible and get back to you both on if either suits what I happen to need.
Thanks again,
guava
0
guava070998Author Commented:
Hi, I tried both, both work, and I like both....so, what do we do about the points here? Technically the second example mimics strtok more, which I asked for...but the first code actually require me to do a wee less work....
How would you both feel about getting this question archived, my points returned, and I ask two 40 point questions, one for each of you, just to pick up the points? (ie: you would just have to offically answer the question, now actual work involved since you answered this one).
Does that sound good, or should I just decide which code does my job better and answer?
ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.
One of a set of tools we're offering as a way to say thank you for being a part of the community.
'Date: 06/08/1998
'Author: Anthony Cornetto
'Input:
' strResult()<String>: Array where results are returned
' strWorking<String>: String to parse
' strDelimiter<String>: Delimiter
'Output:
' <None>
'Purpose: Goes through string, separating it by the delimiter, and
' Returning the elements in an array.
'*************************
Public Sub SeparateString(strResult()
'The separated strings are placed into an array.
Dim lngLastLoc As Long
Dim lngDelimLoc As Long
Dim lngFieldCount As Long
Dim intI As Integer
'clean out string
ReDim strResult(0 To 0) As String
If strWorking <> "" Then
'initialize last location to 0
lngLastLoc = 1
lngFieldCount = 0
lngDelimLoc = InStr(lngLastLoc, strWorking, strDelimiter)
'Continue until no more delimiters are found
Do Until lngDelimLoc = 0
'Set array size
If lngFieldCount > 0 Then
ReDim Preserve strResult(0 To lngFieldCount) As String
End If
'Set string and locations to find next delim
strResult(lngFieldCount) = Mid$(strWorking, lngLastLoc, lngDelimLoc - lngLastLoc)
lngLastLoc = lngDelimLoc + Len(strDelimiter)
lngDelimLoc = InStr(lngLastLoc, strWorking, strDelimiter)
lngFieldCount = lngFieldCount + 1
Loop
'add last field (after delim)
If lngFieldCount > 0 Then
ReDim Preserve strResult(0 To lngFieldCount) As String
End If
strResult(lngFieldCount) = Mid$(strWorking, lngLastLoc)
End If
End Sub