Seite 1 von 1

Split Funktion

Verfasst: 23.03.2009 15:26
von milan1612
UPDATE: Funktion teilweise geaendert

Parameter:
String = Der zu splittende String natuerlich
Delims = Ein String mit allen Delimitern die nicht erhalten bleiben sollen
KeptDelims = Ein String mit den Delimitern die erhalten bleiben sollen
Results = Eine (String) LinkedList in die die Tokens gespeichert werden sollen

Rueckgabewert: Anzahl der gefundenen Ergebnisse

Noch kurz zu den Delimitern:
Die normalen Delims markieren einfach das Ende eines Tokens und werden
dann ignoriert (uebersprungen). Die "KeptDelims" machen das gleiche, werden
aber danach mit in die Liste der Ergebnisse eingefuegt.

Code: Alles auswählen

;Split function
;March 2009
;Milan Schoemig
EnableExplicit

Procedure Split(String.s, Delims.s, KeptDelims.s, List Results.s())
  Protected Buffer.s = ""
  Protected BufferLen = 0
  Protected IsDelim = 0
  Protected *Ptr.Character = @String
  Protected *Delimiter.Character = 0
  Protected DelimToAdd.c = 0

  While *Ptr\c
    *Delimiter = @Delims
    While *Delimiter\c
      If *Delimiter\c = *Ptr\c
        IsDelim = 1
        Goto Skip
      EndIf
      *Delimiter + SizeOf(Character)
    Wend
    *Delimiter = @KeptDelims
    If IsDelim = 0
      While *Delimiter\c
        If *Delimiter\c = *Ptr\c
          IsDelim = 1
          DelimToAdd = *Delimiter\c
          Break
        EndIf
        *Delimiter + SizeOf(Character)
      Wend
    EndIf
  Skip:
    If IsDelim
      If BufferLen
        AddElement(Results())
        Results() = Buffer
        Buffer = ""
        BufferLen = 0
      EndIf
      If DelimToAdd
        AddElement(Results())
        Results() = Chr(DelimToAdd)
        DelimToAdd = 0
      EndIf
      IsDelim = 0
    Else
      Buffer + Chr(*Ptr\c)
      BufferLen + 1
    EndIf
    *Ptr + SizeOf(Character)
  Wend

  If BufferLen
    AddElement(Results())
    Results() = Buffer
  EndIf

  ProcedureReturn ListSize(Results())
EndProcedure


;Tests
;=============================================================
Define teststr.s = "This is a test, that ensures the proper functionality of this beast. bla bla bla..."
Define delimiters.s = " "
Define keptdelimiters.s = ",."
NewList results.s()

Split(teststr, delimiters, keptdelimiters, results())

ForEach results()
  Debug results()
Next

Verfasst: 23.03.2009 16:07
von Andesdaf
super. Kann ich grad gebrauchen! :allright:

Verfasst: 23.03.2009 17:49
von Kaeru Gaman
da nicht jeder weiß, was die "Split"-Methode nun macht, muss man sich also durch den Code wühlen,
und findet dann heraus, dass es sich anscheinend um eine Funktion handelt,
die eine Entsprechung von StringField in einer Schleife benutzt,
um die ergebnisse in einer Liste abzulegen...

hab ich das richtig interpretiert?

Verfasst: 23.03.2009 18:06
von milan1612
Kaeru Gaman hat geschrieben:da nicht jeder weiß, was die "Split"-Methode nun macht, muss man sich also durch den Code wühlen,
und findet dann heraus, dass es sich anscheinend um eine Funktion handelt,
die eine Entsprechung von StringField in einer Schleife benutzt,
um die ergebnisse in einer Liste abzulegen...

hab ich das richtig interpretiert?
Mehr oder weniger, nur viel komfortabler (imho).
Ausserdem kann meine Funktion mit mehreren Delimitern umgehen, ist
schneller und besitzt zusaetzlich eine Option, die Delimiter als Ergebnisse zu interpretieren.

Wenn du es nicht brauchst, dann bleib bei deiner StringField Methode :freak:

Verfasst: 23.03.2009 19:47
von Kaeru Gaman
> Ausserdem kann meine Funktion mit mehreren Delimitern umgehen, ist
> schneller und besitzt zusaetzlich eine Option, die Delimiter als Ergebnisse zu interpretieren.

aha.

na, ist ja nett dass du das immerhin drei posts und zweieinhalb stunden später noch dazusagst.

... so sehr "selbsterklärend" erschien das nämlich mitnichten...


>> Wenn du es nicht brauchst

hab ich nicht gesagt.

aber was man auf jeden Fall gebrauchen kann ist eine Beschreibung.

oder ist "mehrere Delimiter" und "die Delimiter als Ergebnisse zu interpretieren" ein Handkäs, dass das jeder riechen kann?

Verfasst: 24.03.2009 12:49
von milan1612
@Kaeru
Hier mal ein praktisches Beispiel zu den verschiedenen Delimiter Typen:

Code: Alles auswählen

Define teststr.s = "x = 2 + 3*7 - (3^8) / 2"
Define delimiters.s = " "
Define keptdelimiters.s = "=+-*/^()"
NewList results.s()

Split(teststr, delimiters, keptdelimiters, results())

ForEach results()
  Debug results()
Next 
Ein normales Space Zeichen wird einfach ignoriert, die wichtigen Operatoren
aber mit in die Liste uebernommen. Das wird mit der Stringfield Methode ziemlich
schwer zu behandeln. Ich hoffe damit alle Klarheiten beseitigt zu haben... :lol:

Verfasst: 24.03.2009 14:17
von Kaeru Gaman
ja prima.

inzwischen hast du ja auch dein erstes Posting sinnvoll editiert. :D

was ich bemängelte war, dass in deinem ersten posting,
wo eine Beschreibung zu deinem Tipp-Code hingehört,
zuerst nur "sollte selbsterklärend sein" hingeschrieben hast,
und das hatte mich einfach gestört, damit kann ein Anfänger nämlich #Null anfangen.
Bild

Verfasst: 24.03.2009 14:24
von hjbremer
IsDelim = 1
Goto Skip
Break

?????

:shock: :o :?

Verfasst: 24.03.2009 14:29
von milan1612
hjbremer hat geschrieben:IsDelim = 1
Goto Skip
Break

?????

:shock: :o :?
:lol: :lol: :lol:
Geil, das ist mir gar nicht aufgefallen... :allright:

EDIT: Korrigiert, das kommt davon wenn man bestehenden Code erweitert... :wink: