Split Funktion

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Split Funktion

Beitrag 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
Zuletzt geändert von milan1612 am 24.03.2009 14:37, insgesamt 7-mal geändert.
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

super. Kann ich grad gebrauchen! :allright:
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

IsDelim = 1
Goto Skip
Break

?????

:shock: :o :?
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Antworten