Seite 1 von 1

StringSplit

Verfasst: 02.05.2007 23:39
von dater
Hallo,
ich habe ein StringSplit programmiert.

Code: Alles auswählen

; 02.05.2007 Markus Maiwald
; StringSplit(Array(),text.s,trenntext.s)

; Array für die Rückgabe des aufgeteilten String
; text.s = Der Text
; trenntext.s = ein oder mehrere Zeichen, an der der Text getrennt wird.
;
; im Array(0) steht die Anzahl der trennungen. Wenn 0 steht wurde nichts gefunden.
; das LocalArray dienst als TMP-Array es muss mit der Procdure mit Kopiert werden.
;
;Groß-Klein Schreibung spiel keine rolle.

Global Dim localArray.s(0)
Global Dim buffer.s(100)

Procedure StringSplit(array.l,text.s,such.s)
  ; setze Arrayname localArray() auf das an 'array' übergebene
  localArray() = array
l=Len(text.s) : l2=Len(such.s) : te=0 : start=1 : a_index=0
SSweiter:
For s=start To l							; loop text
	a.b=Asc(Mid(text.s,s,1))				; asc Zeichen Text
	For t=1 To l2						; loop suchtext
	b.b=Asc(Mid(such.s,t+te,1))			; asc Zeichen Suchtext
	If a.b=b.b Or (a.b+32)=b.b Or (a.b-32)=b.b; Groß Klein Schreibung aufheben.
		te=te+1						; Anzahl der Treffer 
		If te=l2						; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen 
			ok=ok+1					; Anzahl der gfunden Texte die ersetzt wurden.
			text1.s=Left(text.s,s-l2)		; Linke Textseite
			text2.s=Right(text.s,l-s)		; Rechte Textseite
			a_index=a_index+1
			localArray(a_index) = text1.s
			localArray(a_index+1) = text2.s
			text.s=text2.s
			l=Len(text.s)				; Neue Text Länge
			start=1	; Neuer Start berechnen.		
			te=0						; Treffer auf null
			Goto SSweiter	
		EndIf
		Break
	Else
		te=0
	EndIf
	Next t
Next s
If a_index=0 : a_index=-1 : EndIf
localArray(0)=Str(a_index+1) 
EndProcedure  

Debug "-----------------------------------------------------------------------------------------------------------------------------------"
StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , die Routine ist fertig"," ")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"$$aa$$11$$64$$cc$$FF$$aaaa$$aabbcc$$","$$")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","der")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","DER")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i


Verfasst: 03.05.2007 00:22
von ts-soft
Nett, aber Arrays können in PB4 als Parameter übergeben werden, das
macht die globalen Variablen überflüssig und sorgt dafür das man es
gefahrlos in andere Codes includieren kann.
Du solltest EnableExplicit nutzen, sowie die Variablen in der Procedure mit
Protected deklarieren, damit ich es wirklich wieder verwenden kann, ohne
das sich gleichnamige Variablen erschlagen.

Das deklarieren überlasse ich Dir, hier nur die Anpassung des ArrayParameters

Code: Alles auswählen

; 02.05.2007 Markus Maiwald
; StringSplit(Array(),text.s,trenntext.s)

; Array für die Rückgabe des aufgeteilten String
; text.s = Der Text
; trenntext.s = ein oder mehrere Zeichen, an der der Text getrennt wird.
;
; im Array(0) steht die Anzahl der trennungen. Wenn 0 steht wurde nichts gefunden.
; das LocalArray dienst als TMP-Array es muss mit der Procdure mit Kopiert werden.
;
;Groß-Klein Schreibung spiel keine rolle.

Procedure StringSplit(localArray.s(1),text.s,such.s)

  l=Len(text.s) : l2=Len(such.s) : te=0 : start=1 : a_index=0
  SSweiter:
  For s=start To l                     ; loop text
    a.b=Asc(Mid(text.s,s,1))            ; asc Zeichen Text
    For t=1 To l2                  ; loop suchtext
      b.b=Asc(Mid(such.s,t+te,1))         ; asc Zeichen Suchtext
      If a.b=b.b Or (a.b+32)=b.b Or (a.b-32)=b.b; Groß Klein Schreibung aufheben.
        te=te+1                  ; Anzahl der Treffer
        If te=l2                  ; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen
          ok=ok+1               ; Anzahl der gfunden Texte die ersetzt wurden.
          text1.s=Left(text.s,s-l2)      ; Linke Textseite
          text2.s=Right(text.s,l-s)      ; Rechte Textseite
          a_index=a_index+1
          localArray(a_index) = text1.s
          localArray(a_index+1) = text2.s
          text.s=text2.s
          l=Len(text.s)            ; Neue Text Länge
          start=1   ; Neuer Start berechnen.
          te=0                  ; Treffer auf null
          Goto SSweiter
        EndIf
        Break
      Else
        te=0
      EndIf
    Next t
  Next s
  If a_index=0 : a_index=-1 : EndIf
  localArray(0)=Str(a_index+1)
EndProcedure


Dim buffer.s(100)

Debug "-----------------------------------------------------------------------------------------------------------------------------------"
StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , die Routine ist fertig"," ")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"$$aa$$11$$64$$cc$$FF$$aaaa$$aabbcc$$","$$")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","der")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","DER")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Ist jetzt nicht böse gemeint, jedoch sind diese Anpassungen wichtig, wenn
man den Code als Baustein in anderen Programmen nutzen möchte

Gruß
Thomas

Anpassung - Danke

Verfasst: 03.05.2007 09:23
von dater
Hallo,
Danke.. ich bin immer Dankbar für solche Tip's, dass wuste ich noch nicht!
EnableExplicit - da muss ich erst mal nachlesen !
Dater.

Verfasst: 03.05.2007 09:33
von edel
Das mit dem Goto in der "For" Schleife ist nicht so toll , versuche es mal
lieber mit

Code: Alles auswählen

s=start  
Continue

Verfasst: 03.05.2007 13:49
von Thalius
Hihi, muss zugeben ich hab das hier nur mal überflogen - ( imo muss ich mal sehen dass ich meine Brötchen verdiene ).

Aber denke zu dem Thema hatte ich mal ein paar Codes zusammen-/ gesucht, geflickt - kann mich nicht mehr errinnern ob ich die mal gepostet hatte oder ned ...

trotzdem .. hier villeicht gibts dir n paar Ideen:

Code: Alles auswählen

;** CountArray
;* Returns the Size of an Array as long.
Macro CountArray(array)
  PeekL(@array - 8)
EndMacro

Dim myArr.String(6) 


;** Split2Arr
;* Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by the string delimiter. 
;* The Arraysize limits the Result.
;/ Args: *ptr2Array (l), String (s) , Delimeter (s)
Procedure Split2Arr(*MyArray.String,string.s,delim.s)
  Protected i.l, ArrSize.l
  ArrSize.l = PeekL(*MyArray - 8)
  For i.l = 0 To ArrSize.l 
    If i.l <= ArrSize.l
      *MyArray\s = StringField(string.s, i.l+1,delim.s) : *MyArray + 4
    EndIf
  Next  
EndProcedure

;** Split2ArrayR
;* Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by the string delimiter. 
;* The Array is dynamically resized 
;/ Args: Array.Type(Size) (l), String (s) , Delimeter (s)
Procedure.l Split2ArrayR(array.s(1), Text.s, separator.s = ",") ; String to Array
  Protected index.l, Size.l = CountString(Text, separator)
  Redim array.s(Size)
  For index = 0 To Size
    array(index) = StringField(Text, index + 1, separator)
  Next
  ProcedureReturn Size
EndProcedure

;** JoinArray
;* Returns a string containing a string representation of all the array elements in the same order, 
;* with the Delimeter string between each element.
;/ Args: Array.Type(Size) (l), Delimeter (s)
Procedure.s JoinArray(array.s(1), separator.s = ",") ; Array to String
  Protected index.l, Result.s, Size.l = CountArray(array()) - 1
  For index = 0 To Size
    Result + array(index)
    If (index < Size)
      Result + separator
    EndIf
  Next
  ProcedureReturn Result
EndProcedure

;** SplitList
;* Creates an LinkedList of strings, each of which is a substring of string formed by splitting it on boundaries formed by the string delimiter. 
;* Result: Size of the Linked List
;/ Args: List.Type() (l), String (s) , Delimeter (s)
Procedure.l SplitList(list.s(), Text.s, separator.s = ",") ; String to List
  Protected index.l, Size.l = CountString(Text, separator)
  For index = 0 To Size
    If AddElement(list())
      list() = StringField(Text, index + 1, separator)
    EndIf
  Next
  ProcedureReturn Size
EndProcedure

;** JoinList
;* Returns a string containing a string representation of all the List elements in the same order, 
;* with the Delimeter string between each element.
;* Result: List-Combined String
;/ Args: List.Type() (l), Delimeter (s)
Procedure.s JoinList(list.s(), separator.s = ",") ; List to String
  Protected Result.s, Size.l = CountList(list()) - 1
  ForEach list()
    Result + list()
    If (ListIndex(list()) < Size)
      Result + separator
    EndIf
  Next
  ProcedureReturn Result
EndProcedure


;-- 

;/ Example

Split2Arr(@myArr(),"Hello I am a arrayed split string"," ")

Debug "0:"+myArr(0)\s
Debug "1:"+myArr(1)\s
Debug "2:"+myArr(2)\s
Debug "3:"+myArr(3)\s
Debug "4:"+myArr(4)\s
Debug "5:"+myArr(5)\s
Debug "6:"+myArr(6)\s

;/ ----

string.s = "abc,defg,hi,jklmop,qrs,tuv,wxyz"

; string -> array -> string

Dim a.s(0)

Size.l = Split2ArrayR(a(), string, ",")

For i = 0 To Size
  Debug a(i)
Next

Debug JoinArray(a())

; string -> list -> string

NewList b.s()

If SplitList(b(), string)
  ForEach b()
    Debug b()
  Next
EndIf

Debug JoinList(b())
Thalius

Stringreplace ohne Goto und mit EnableExplicit

Verfasst: 04.05.2007 04:17
von dater
Hi,
ich habe den Code etwas optimiert ohne Goto und mit Define für EnableExplicit.

Code: Alles auswählen

; 02.05.2007 Markus Maiwald
; StringSplit(Array(),text.s,trenntext.s)

; Array für die Rückgabe des aufgeteilten String
; text.s = Der Text
; trenntext.s = ein oder mehrere Zeichen, an der der Text getrennt wird.
;
; im Array(0) steht die Anzahl der trennungen. Wenn 0 steht wurde nichts gefunden.
; das LocalArray dienst als TMP-Array es muss mit der Procdure mit Kopiert werden.
;
;Groß-Klein Schreibung spiel keine rolle.

Procedure StringSplit(localArray.s(1),text.s,such.s)
  ; setze Arrayname localArray() auf das an 'array' übergebene
Define.l	l,l2,te,start,s,anzahl,ok,t,a_index 
Define.b	grosklein,gk,a,b
Define.s 	text,text1,text2,such

l=Len(text.s) : l2=Len(such.s) : te=0 : start=1 : a_index=0 : s=0
Repeat
	a.b=Asc(Mid(text.s,s,1))				; asc Zeichen Text
	For t=1 To l2						; loop suchtext
	b.b=Asc(Mid(such.s,t+te,1))			; asc Zeichen Suchtext
	If a.b=b.b Or (a.b+32)=b.b Or (a.b-32)=b.b; Groß Klein Schreibung aufheben.
		te=te+1						; Anzahl der Treffer 
		If te=l2						; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen 
			ok=ok+1					; Anzahl der gfunden Texte die ersetzt wurden.
			text1.s=Left(text.s,s-l2)		; Linke Textseite
			text2.s=Right(text.s,l-s)		; Rechte Textseite
			a_index=a_index+1			; index erhöhen
			localArray(a_index) = text1.s	; Array füllen
			localArray(a_index+1) = text2.s	; das ancächste Array auch füllen
			text.s=text2.s				; Neuer text bestimmen 
			l=Len(text.s)				; Neue Text Länge
			start=1					; Neuer Start berechnen.		
			te=0	
			s=0
			Continue					; Treffer auf null
		EndIf
		Break
	Else
		te=0
	EndIf
	Next t
	s=s+1
Until s>l

If a_index=0 : a_index=-1 : EndIf
localArray(0)=Str(a_index+1) 
EndProcedure  



Global Dim buffer.s(100)
Define.l anzahl,i

Debug "-----------------------------------------------------------------------------------------------------------------------------------"
StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , die Routine ist fertig"," ")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"$$aa$$11$$64$$cc$$FF$$aaaa$$aabbcc$$","$$")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","der")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","DER")

anzahl=Val(Buffer(0))
For i=1 To anzahl
	Debug buffer.s(i)
Next i



Verfasst: 04.05.2007 05:23
von ts-soft
Mit EnableExplicit wären Dir noch ein paar kleine Fehler aufgefallen!
Die ProcedureParameter sind autom. als Protected deklariert, dürfen also
nicht nochmals in der Procedure deklariert werden! Das betrifft jetzt
text.s und such.s

In Proceduren ist es im allg. besser Protected zu deklarieren! Nur so wird
sichergestellt, das diese Variable nur in dieser Prozedure gültig ist und
z.B. gleichnamige Globale Variablen nicht verändert werden, das ist mit
Define nicht gegeben. Also Define ausserhalb von Proceduren, Protected
innerhalb. In bestimmten Fällen kann man davon zwar abweichen, aber
meist fährt man so am besten.

buffer.s() global zu deklarieren war unnötig! Unnötige globale Variablen sind
zu vermeiden, auch wenn es jetzt nur im Beispielcode war.

Hier nochmal Dein Code, mit lediglich den erwähnten Anpassungen, die ich
für wichtig halte!

Code: Alles auswählen

; 02.05.2007 Markus Maiwald
; StringSplit(Array(),text.s,trenntext.s)

; Array für die Rückgabe des aufgeteilten String
; text.s = Der Text
; trenntext.s = ein oder mehrere Zeichen, an der der Text getrennt wird.
;
; im Array(0) steht die Anzahl der trennungen. Wenn 0 steht wurde nichts gefunden.
; das LocalArray dienst als TMP-Array es muss mit der Procdure mit Kopiert werden.
;
;Groß-Klein Schreibung spiel keine rolle.

EnableExplicit

Procedure StringSplit(localArray.s(1),text.s,such.s)
  ; setze Arrayname localArray() auf das an 'array' übergebene
  Protected l.l,l2.l,te.l,start.l,s.l,anzahl.l,ok.l,t.l,a_index.l
  Protected grosklein.b,gk.b,a.b,b.b
  Protected text1.s,text2.s

  l=Len(text.s) : l2=Len(such.s) : te=0 : start=1 : a_index=0 : s=0
  Repeat
    a.b=Asc(Mid(text.s,s,1))            ; asc Zeichen Text
    For t=1 To l2                  ; loop suchtext
      b.b=Asc(Mid(such.s,t+te,1))         ; asc Zeichen Suchtext
      If a.b=b.b Or (a.b+32)=b.b Or (a.b-32)=b.b; Groß Klein Schreibung aufheben.
        te=te+1                  ; Anzahl der Treffer
        If te=l2                  ; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen
          ok=ok+1               ; Anzahl der gfunden Texte die ersetzt wurden.
          text1.s=Left(text.s,s-l2)      ; Linke Textseite
          text2.s=Right(text.s,l-s)      ; Rechte Textseite
          a_index=a_index+1         ; index erhöhen
          localArray(a_index) = text1.s   ; Array füllen
          localArray(a_index+1) = text2.s   ; das ancächste Array auch füllen
          text.s=text2.s            ; Neuer text bestimmen
          l=Len(text.s)            ; Neue Text Länge
          start=1               ; Neuer Start berechnen.
          te=0
          s=0
          Continue               ; Treffer auf null
        EndIf
        Break
      Else
        te=0
      EndIf
    Next t
    s=s+1
  Until s>l

  If a_index=0 : a_index=-1 : EndIf
  localArray(0)=Str(a_index+1)
EndProcedure



Dim buffer.s(100)
Define.l anzahl,i

Debug "-----------------------------------------------------------------------------------------------------------------------------------"
StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , die Routine ist fertig"," ")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"$$aa$$11$$64$$cc$$FF$$aaaa$$aabbcc$$","$$")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","der")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Debug "-----------------------------------------------------------------------------------------------------------------------------------"

StringSplit(buffer(),"Hallo, es ist Heute der 03.05.2007. , der Mittwoch ist fast um.","DER")

anzahl=Val(Buffer(0))
For i=1 To anzahl
  Debug buffer.s(i)
Next i
Gruß Thomas