Split()/Join() Funktionen

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Split()/Join() Funktionen

Beitrag von helpy »

Hi all,

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" )