tags:

views:

15

answers:

1

The following Split function found at support.microsoft.com does not create array values corresponding to consecutive delimiters.

eg. the string "hello|world||today" would generate the array: arr[0] = "hello", arr[1] = "world", arr[2] = "today" instead of the more correct: arr[0] = "hello", arr[1] = "world", arr[2] = "", arr[3] = "today". How can I correct the code so that the latter result is generated?

     Public Function Split(ByVal sIn As String, Optional sDelim As _
            String, Optional nLimit As Long = -1, Optional bCompare As _
             VbCompareMethod = vbBinaryCompare) As Variant
          Dim sRead As String, sOut() As String, nC As Integer
          If sDelim = "" Then
              Split = sIn
          End If
          sRead = ReadUntil(sIn, sDelim, bCompare)
          Do
              ReDim Preserve sOut(nC)
              sOut(nC) = sRead
              nC = nC + 1
              If nLimit <> -1 And nC >= nLimit Then Exit Do
              sRead = ReadUntil(sIn, sDelim)
          Loop While sRead <> ""
          ReDim Preserve sOut(nC)
          sOut(nC) = sIn
          Split = sOut
      End Function

      Public Function ReadUntil(ByRef sIn As String, _
            sDelim As String, Optional bCompare As VbCompareMethod _
          = vbBinaryCompare) As String
          Dim nPos As String
          nPos = InStr(1, sIn, sDelim, bCompare)
          If nPos > 0 Then
              ReadUntil = Left(sIn, nPos - 1)
              sIn = Mid(sIn, nPos + Len(sDelim))
          End If
      End Function
A: 

I haven't tried this with many combinations but it seems to do the trick. I changed the condition on the loop, what value is entered as the last item in the array and added an else in ReadUntil.

Public Function Split(ByVal sIn As String, Optional sDelim As _
      String, Optional nLimit As Long = -1, Optional bCompare As _
       VbCompareMethod = vbBinaryCompare) As Variant
    Dim sRead As String, sOut() As String, nC As Integer
    If sDelim = "" Then
        Split = sIn
    End If
    sRead = ReadUntil(sIn, sDelim, bCompare)
    Do
        ReDim Preserve sOut(nC)
        sOut(nC) = sRead
        nC = nC + 1
        If nLimit <> -1 And nC >= nLimit Then Exit Do
        sRead = ReadUntil(sIn, sDelim)
    Loop While sIn <> ""
    ReDim Preserve sOut(nC)
    sOut(nC) = sRead
    Split = sOut
End Function

Public Function ReadUntil(ByRef sIn As String, _
      sDelim As String, Optional bCompare As VbCompareMethod _
    = vbBinaryCompare) As String
    Dim nPos As String
    nPos = InStr(1, sIn, sDelim, bCompare)
    If nPos > 0 Then
        ReadUntil = Left(sIn, nPos - 1)
        sIn = Mid(sIn, nPos + Len(sDelim))
    Else
        ReadUntil = sIn
        sIn = ""
    End If
End Function
Corin