Написание собственной функции Split для более ранней версии VB. Как обрабатывать несколько разделителей подряд? - PullRequest
0 голосов
/ 06 сентября 2010

Следующая функция Split, найденная на support.microsoft.com, не создает значения массива, соответствующие последовательным разделителям.

например.строка «hello | world || today» будет генерировать массив: arr[0] = "hello", arr[1] = "world", arr[2] = "today" вместо более правильного: arr[0] = "hello", arr[1] = "world", arr[2] = "", arr[3] = "today".Как я могу исправить код так, чтобы генерировался последний результат?

     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

1 Ответ

0 голосов
/ 25 сентября 2010

Я не пробовал это со многими комбинациями, но, похоже, сработало.Я изменил условие в цикле, какое значение вводится как последний элемент в массиве, и добавил еще одно в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...