TIA String Zerlegung Find

donkey

Level-1
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte gerne einen String in seine "Einzelteile" zerlegen und die einzelnen Werte wieder in einem DB speichern.
Ich habe schon sämtliche Forenbeiträge durchforstet-nichts hat so richtig gepasst/ funktioniert. Bisher habe ich nur eine sehr unschöne Lösung...

Die einzelnen Werte sind durch Semikolon getrennt. Mit dem Befehl Find habe ich das erste Semikolon gefunden. Wie kann man es hinbekommen, dass mit dem zweiten Find-Befehl das zweite Semikolon usw. gefunden wird?

Meine bisherige lösung könnt ihr euch im Screenshot anschauen

Ich stehe gerade komplett auf dem Schlauch. Vielleicht hat ja jemand ne Idee...

Vielen Dank :)

Bild 1.jpg
 
Hallo,
dein Screenshot hat nun nicht wirklich die Super-Qualität ...
Ungeachtet dessen :
- Du kopierst dir den String in eine Hilfs-Variable
- Nach dem FIND schneidest du dir den ersten Teil aus
- ersetzt dann das Semikolon durch ein anderes Zeichen und merkst dir die letzte Position
- nun machst du wieder FIND und findest nun das nächste Semikolon
- usw.
Oder :
- nach dem FIND nimmst du den ersten Teil und kopierst dir alles nach der Position in eine Hilfsvariable
- mit der Hilfsvariable wiederholst du das Spiel
- usw.

Gruß
Larry
 
Mit FIND suchen, danach mit RIGHT den linken Teil abschneiden. Dann wieder mit FIND suchen usw. Eventuell in eine Schleife verpackt.
 
Moin donkey,

oder:

- mit FIND das erste Semikolon finden
- mit LEFT den linken Teil der Zeichen kette umkopieren
- mit DELETE den linken Teil der Zeichenkette (inkl. erstem Semikolon) löschen

Das mit einer Schleifenfunktion durcharbeiten, bis alle Semikolons eliminiert wurden.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe mal versucht, etwas SPLIT-ähnliches zu basteln, total ungetestet, vielleicht als Anregung zu gebrauchen?
Code:
idx   := 0 ;   // array-index
iLmax := 255 ; // max. zulässige StringLänge
iPos1 := 0 ;   // PositionsZeiger1 vorbesetzen
WHILE iPos1 < LEN (S:= sTxt) DO
     iPos0 := FIND (IN1:= MID (IN:= sTxt, L:= iLmax, P:= iPos1 + 1), IN2:=';') ; // ist Schachtelung überhaupt möglich???
     IF iPos0 = 0 THEN // kein weiteres Semikolon vorhanden
         a[idx] := MID (IN:= sTxt, L:= iLmax, P:= iPos1 + 1) ; // Rest nach letztem Semikolon --> array
         EXIT ;
     ELSE // weiteres Semikolon vorhanden
         iPos2 := iPos1 + iPos0 ; // PositionZeiger auf Position im GesamtText umrechnen
         a[idx] := MID (IN:= sTxt, L:= iPos2 - iPos1 - 1, P:= iPos1 + 1) ; // TeilText --> array
     END_IF ;
     idx := idx + 1 ;
     iPos1 := iPos2 ;
END_WHILE ;
 
Hallo Heinrich,

ich weiß jetzt nicht, ob dein Code funktionieren würde ... machen würde ich es so aber nicht ...
- dein Array a, das ja die SPLIT-Elemente beinhalten soll, kann ja nicht dynamisch dimensioniert werden - wie groß legst du es also an ?
- er wäre für meinen Geschmack "etwas" undurchsichtig (selbst mit Beschreibung) ...

Aber klar ... als Anregung ... ;)

Gruß
Larry
 
- dein Array a, das ja die SPLIT-Elemente beinhalten soll, kann ja nicht dynamisch dimensioniert werden - wie groß legst du es also an ?
Moin Ralf,

ganz einfach: "gross genug".
Wie viel das im konkreten EinsatzFall ist, weiss ich beim besten Willen nicht.
Müsste der TE aber abschätzen können. Und etwas Reserve einplanen. Und man kann doch auch ubound abfragen und die Zerlegung ggfs rechtzeitig abbrechen. Das letzte ArrayElement enthält dann den restlichen, noch unzerlegten String. Auf den könnte man genau so eine Zerlegung anwenden, u.s.w. ...
Möglichkeiten gibt es natürlich viele und man hat darum leider auch die Qual der Wahl. ;)

Undurchsichtig mag das Verfahren auf den ersten Blick sein und ich war wahrscheinlich auch (zu) sparsam mit den Kommentaren.
Der FIND sucht ab StringAnfang bzw. ab der auf das zuletzt gefundene Semikolon folgenden Position nach dem nächsten Semikolon.
iPos1 ist die AnfangsPosition - 1, also die Position des zuletzt gefundenen oder des "gedachten" Semikolons vor dem String. iPos2 die EndPosition + 1, also die Position des aktuell gefundenen Semikolons.
Der Text zwischen iPos1 und iPos2 wird mit MID selektiert und in das aktuelle ArrayElement kopiert.
Wird kein weiteres Semikolon gefunden, wird nicht der Bereich zwischen iPos1 und iPos2 selektiert, denn iPos2 konnte nicht ermittelt werden, könnte man zwar aus der Länge des Strings ermitteln - braucht man aber nicht, das kann der MID ganz allein, indem man für den Parameter L einen zu grossen Wert angibt, dann nimmt er nur so viele Zeichen, wie der String noch "hergibt".

PS:
iPos0 gibt die Position des ';' im untersuchten per MID selektierten TeilString an. Deshalb wird noch iPos1 dazu addiert und man somit die Position iPos2 im Gesamtstring erhält.
Alles, was man mit LEFT und RIGHT machen kann, kann auch der MID.
Dass MID einen Parameter mehr hat, darf einen nicht abschrecken. Wenn man in einer Schleife noch eine FallUnterscheidung für die Verwendung von LEFT, RIGHT oder MID spendieren muss, ist die einheitliche Verwendung des MID die einfachere Lösung.

Gruss, Heinileini
 
Zurück
Oben