Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Daten / Strings / Join

Join - Teilstrings zusammenfügen

Beschreibung

Seit VB6 gibt es die sogenannte Join-Funktion, die alle Strings aus einem Array sArray zu einem langen String zusammenfügt. Optional kann angegeben werden, welche Zeichenkette Delimiter zwischen den einzelnen Strings eingefügt werden soll, wobei das Leerzeichen als Standard gilt. Join ist übrigens die Umkehrfunktion zur Split-Funktion.

Beispiel

Dim s As String
Dim sa(1 To 4) As String

sa(1) = "Hier"
sa(2) = "ist"
sa(3) = "ein"
sa(4) = "Text."
s = Join(sa)
MsgBox s 'ergibt "Hier ist ein Text."

Code

Der naive Ansatz zur Lösung führt oft zu folgendem Code:
Public Function Join( _
    ByRef sArray() As String, _
    Optional ByRef Delimiter As String = " " _
  ) As String
  Dim i As Long

  For i = LBound(sArray) To UBound(sArray) - 1
    Join = Join & sArray(i) & Delimiter
  Next i
  Join = Join & sArray(UBound(sArray))
End Function
Jedoch ist die Laufzeit dieser Routine wegen der vielen String-Konkatenationen nicht akzeptabel (s.a. Strings schnell aneinander hängen).

Folgende Lösung ist deutlich schneller, da sie den "Trick" mit dem MidB$-Statement benutzt. Durch Nutzung von LenB und MidB wird ein weiterer Performance-Schub erreicht.
Public Function Join( _
    ByRef sArray() As String, _
    Optional ByRef Delimiter As String = " " _
  ) As String
  Dim JoinLen As Long
  Dim JoinPtr As Long
  Dim DelimiterLen As Long
  Dim LB As Long
  Dim UB As Long
  Dim i As Long
  
  'Gesamtlänge aller Strings bestimmen:
  LB = LBound(sArray)
  UB = UBound(sArray)
  For i = LB To UB
    JoinLen = JoinLen + LenB(sArray(i))
  Next i
  
  JoinPtr = 1
  DelimiterLen = LenB(Delimiter)
  If DelimiterLen Then
  
    'Ergebnis-String anlegen:
    JoinLen = JoinLen + DelimiterLen * (UB - LB)
    Join = Space$(JoinLen \ 2)
    
    'Kopieren:
    For i = LB To UB - 1
      MidB$(Join, JoinPtr) = sArray(i)
      JoinPtr = JoinPtr + LenB(sArray(i))
      MidB$(Join, JoinPtr) = Delimiter
      JoinPtr = JoinPtr + DelimiterLen
    Next i
    MidB$(Join, JoinPtr) = sArray(i)
  
  Else
  
    'Ergebnis-String anlegen:
    Join = Space$(JoinLen \ 2)
    
    'Kopieren:
    For i = LB To UB
      MidB$(Join, JoinPtr) = sArray(i)
      JoinPtr = JoinPtr + LenB(sArray(i))
    Next i
  
  End If 'DelimiterLen
End Function

© Jost Schwider, 29.01.2001-29.01.2001 - http://vb-tec.de/strjoin.htm