Trick 48:
Präzisions-Ersetzungen
Aufgabe:
Schnell mal eben in eine Zeichenfolge an einer bestimmten
Position 1 oder mehr
Zeichen einfügen, und zwar
mit oder ohne
Ersetzung von 1 oder mehr dort stehenden Zeichen
Warum? Man hat zuweilen Zeichenfolgen, in denen an bestimmten (festen)
Positionen bestimmte Angaben
stehen, die man durch etwas anderes
ersetzen will.
Hinweis: Zum Ersetzen von exakten Zeichenfolgen an beliebiger Stelle
durch andere gibt es
den Befehl insert %abc%xyz%
Zum Ersetzen einzelner
Zeichen oder Doppelzeichen durch andere
im gesamten Text (das
nennt man "Umcodierung") gibt es das
Instrumentarium des
Befehls xcode
Lösung:
Man schreibt sich eine Datei stri.inc (siehe unten) und
bindet sie
mit "include stri.inc" ein.
So wird die Funktion dann benutzt:
Wenn in das Feld #789 an der Position 11 die Zeichen "abc"
eingesetzt
werden sollen, dort genau 2 Zeichen ersetzend, die vorher da stehen,
dann macht man folgendes:
var
#789
Startstring
ins #usT
Befehlsstring (kann
beliebig konstruiert werden, auch aus Variablen!)
var "10,abc,2"
(Statt , als Trenner ist
auch / möglich)
Aufruf
perf stri
Ergebnis in iV nach #789
sichern
ins #789
var "Resultat: " #789
mes
... weitere Aktionen
Am Ende das UP einbinden:
include stri.inc
Und
dies ist das Unterprogramm stri.inc
***********************************************************
STRI.INC : Zeichen an fester Position in eine Zeichenfolge einfuegen
2007-07-17
u.U. mit Ersetzung vorhandener Zeichen
Aufruf : Man besetzt
zuerst folgende Variable:
#usT : die Ausgangs-Zeichenfolge
iV : zahl1,zeichenfolge,zahl2 oder /
statt ,
die beiden Zahlen muessen positive ganze sein oder 0
zahl2 mit dem vorangehenden Komma darf fehlen
Bedeutung: zahl1 Zeichen vom Anfang von #usT belassen
dann die zeichenfolge anhaengen
vom Rest von #usT zahl2 Zeichen wegnehmen,
und was noch von #usT uebrig ist, anhaengen
Beispiele:
Das vierte Zeichen durch x ersetzen
var "3,x,1"
In #upo steht Position, in #uez die einzufueg. Zeichen
in #uaz ANz. der zu ersetzenden Zeichen
var #upo "," #uez "," #uaz
Hinter dem 10. Zeichen Inhalt von #uab zwischenfügen
var "10," #uab ",0" oder var "10," #uab
Vorn 2 Zeichen durch abcdeg ersetzen, Rest belassen
var "0,abcdeg,2"
(einfacher mit var "abc" #usT(2,0) )
Hinter dem 2. Zeichen abcdeg einsetzen, Rest weg
var "2,abcdeg,1000"
(einfacher mit var #usT(0,2) "abcdeg" !)
Dann der Aufruf:
perf stri
Ergebnis steht danach in der iV
UPro beginnt hier
end
Setze
#uS1 = zahl1 , #uS2=zahl2 , #uSB = Zeichenfolge bei Beginn
:stri
Kontrolle beim Testen
mes
ins #uSB
var #uSB(f"0123456789")
if "/" jump stri:s
if not "," return
Komma ist Trennung:
var #uSB(e",")
ins #uS1
var #uSB(b"," b",")
ins #uS2
Trennsymbol ,
#uST,
jump stri:w
/ ist Trennung:
:stri:s
var #uSB(e"/")
ins #uS1
var #uSB(b"/" b"/")
ins #uS2
Trennsymbol /
#uST/
:stri:w
eval #uS1 + #uS2
Position, wo der Rest
beginnt
ins #uS3
Manipulations-Ausdruck in
die iV schreiben:
(beachte den Nebentrick mit dem Trennsymbol #uST)
var #uS1
if not "0" var "#usT(0," #uS1 "
F' ') #uSB(b'#uST' e'#uST') #usT(" #uS3 ",0)"
if "0" var "#uSB(b'#uST' e'#uST')
#usT(" #uS3 ",0)"
zur Kontrolle beim Testen
den Ausdruck zeigen:
mes
Ausdruck
auswerten (das ist der eigentliche Trick!)
var
Nun steht das Erg. in der
iV
Hilfsvar. loeschen
#uST
#uSB
#uS1
#uS2
#uS3
return
**********************************************************