Hier die zwei Funktionen Split/Join. In der Funktionalität habe ich mich weitestgehenst an die beiden Funktionen von VB gehalten. Vielleicht kann es ja der eine oder andere gebrauchen.
Sie sind kein besonderer Code/Tipp/Trick, deshalb habe ich die Funktionen hier hereingestellt.
cu, helpy
Code: Alles auswählen
EnableExplicit
; Konstanten für die Split() Funktion
Enumeration
#splitCaseSensitive ; Groß-/Kleinschreibung beachten
#splitNotCaseSensitive ; Groß-/Kleinschreibung nicht beachten
EndEnumeration
;==============================================================================
; Funktion: Split( aString(), sString [, Seperator [, Count [, Compare ]]] )
;
; Kurzbeschreibung: Gibt ein nullbasiertes, eindimensionales Array zurück,
; das eine angegebene Anzahl von Teil-Strings enthält.
;
; Argumente:
; aString ....... Array, das mit den Teilstrings gefüllt werden soll.
; sString ....... Zeichenfolgenausdruck mit Teil-Strings und Trennzeichen.
; Ist Ausdruck eine Zeichenfolge mit der Länge 0, gibt Split
; ein leeres Array zurück (Array-Größe = 0, Array(0) = "").
; Seperator ..... Optional. Zeichen zum Identifizieren der Begrenzungen von
; Teil-Strings. Ohne Angabe wird das Leerzeichen (" ")
; als Trennzeichen angenommen. Ist Trennzeichen eine
; Zeichenfolge mit der Länge Null, wird ein Array mit einem
; Element, das die ganze Zeichenfolge Ausdruck enthält,
; zurückgegeben.
; Wird als Trennzeichen ein String mit einer Länge > 1
; angegeben, dann gilt der gesamte String als EIN
; Trennzeichen. Es ist also möglich als Trennzeichen
; z.B. #CRLF$ anzugeben.
; Befindet sich zwischen aufeinander folgenden Trennzeichen
; kein anderes Zeichen, dann wird an dieser Stelle als
; Teil-String ein leerer String zurück gegeben.
; Ein Trennzeichen am Ende des auszuwertenden Strings
; bedeutet, dass als letzter Teil-String ein leerer String
; zurück gegeben wird.
; Count ......... Optional. Anzahl der Teil-Strings, die zurückgegeben
; werden sollen. -1 zeigt an, dass alle Teil-Strings
; zurückgegeben werden.
; Wird hier der Wert 0 angegeben, , gibt Split ein leeres
; Array zurück (Array-Größe = 0, Array(0) = "").
; Compare ....... Optional. Numerischer Art des Vergleichs bei der Auswertung
; von Teil-Strings. Gültige Werte sind:
; - #splitCaseSensitive
; => Groß-/Kleinschreibung beachten
; - #splitNotCaseSensitive
; => Groß-/Kleinschreibung nicht beachten
;
; Ergebnis: Die Funktion liefert als Ergebnis die Anzahl der zurückgelieferten
; Teil-Strings
;
Procedure.l Split( aArray.s(1), sString.s, Separator.s=" ", Count.l=-1, Compare.l=#splitCaseSensitive )
Protected tmpString.s, tmpSeparator.s
Protected cCount.l, iCount.l, *Char.Character
Protected pos1.l, pos2.l, sLen.l
If sString = "" Or Count = 0
; Wenn String leer oder Count gleich 0 ist, dann wird das Array gelöscht!
Dim aArray.s(0)
ProcedureReturn 0
EndIf
If Separator = ""
; Wenn Trennzeichen leer ist, dann wird der ganze String
; in ein Array mit einem Element zurückgegeben
Dim aArray.s(0)
aArray(0) = sString
ProcedureReturn 1
EndIf
If Compare = #splitNotCaseSensitive
tmpString = LCase(sString)
tmpSeparator = LCase(Separator)
Else
tmpString = sString
tmpSeparator = Separator
EndIf
sLen = Len(tmpSeparator)
*Char = @tmpString
pos1 = 1
While pos1 > 0
pos1 = FindString( tmpString, tmpSeparator, pos1 )
If pos1 > 0
cCount + 1
pos1 + sLen
EndIf
Wend
If Count < 0
Count = cCount + 1
EndIf
Dim aArray.s(Count - 1)
*Char = @tmpString
pos2 = 1
iCount = 0
While pos2 > 0
pos1 = pos2
pos2 = FindString( tmpString, tmpSeparator, pos2 )
If pos2 > 0
aArray(iCount) = PeekS(@sString + pos1 - 1, pos2 - pos1 )
pos2 + sLen
Else
aArray(iCount) = PeekS(@sString + pos1 - 1, Len(sString) - pos1 + 1 )
EndIf
iCount + 1
If iCount >= Count : Break : EndIf
Wend
ProcedureReturn iCount
EndProcedure
;==============================================================================
; Funktion: Join( aString() [, Seperator ] )
;
; Kurzbeschreibung: Gibt eine durch Verbinden einer Reihe von Teil-Strings
; in einem Array jgespeicherte Zeichenfolge zurück.
;
; Argumente:
; aString ....... Array, das mit den Teilstrings gefüllt ist und wieder
; zusammen gesetzt werden soll.
; Seperator ..... Optional. Zeichen mit dem einzelnen Teil-Strings wieder
; miteinander verbunden werden. Wird dieses Zeichen nicht
; angegeben, wird ein Leerzeichen verwendet.
; Ist Seperator eine Zeichenfolge mit der Länge 0,
; werden alle Teile ohne Trennzeichen miteinander verbunden.
;
; Ergebnis: Die Funktion liefert als Ergebnis den zusammengesetzten
; String zurück.
;
Procedure.s Join( aArray.s(1), Separator.s = " ")
; (PeekL(@array - 8) - 1)
Protected cCount.l, iCount.l
Protected tmpString.s = ""
Protected *Char.Character
cCount = PeekL(@aArray() - 8) - 1
For iCount = 0 To cCount
tmpString + aArray(iCount) + Separator
Next iCount
; Den letzten Separator entfernen!
*Char = @tmpString + Len(tmpString) - Len(Separator)
*Char\c = 0
ProcedureReturn tmpString
EndProcedure
;==============================================================================
; TEST
;
Dim myString.s(0)
Define x.l, i.l
Define s.s
Macro test( string, sep, count, newsep )
Debug "--------------------------------------------------------"
Debug "String: " + string
Debug "--------"
x = Split( myString(), string, sep, count )
Debug Str(x) + " Elemente"
For i = 0 To x-1
Debug Str(i+1) + " :: " + myString(i)
Next i
s = Join(myString(), newsep)
Debug "--------"
Debug "Join: " + s
EndMacro
test( "Das ist ein Text! Ein langer langer langer und noch längerer Text!", " ", -1, "-" )
test( "Das ist ein Text! Ein langer langer langer und noch längerer Text!", " ", -1, "-" )
test( "01XY23XY45XY67XY89", "XY", -1, "-" )
test( "XY01XY23XY45XY67XY89XY", "XY", -1, "XY" )
test( "XY01XY23XY45XY67XY89XY", "XY", 4, "XY" )