[Tustep-Liste] access loop
Kuno Sch�lkle
Schaelkle at zdv.uni-tuebingen.de
Di Mai 2 14:51:23 CEST 2006
Lieber Herr Kollatz,
das folgende Makro sollte Ihr Problem loesen.
Das Makro geht allerdings davon aus, dass die
Daten in Ordnung sind. Besser waere wohl,
wenn man zur Sicherheit noch Abfragen einfuegt,
damit inkonsistente Daten erkannt werden.
$$! quelle, ziel
$$=- {}
MODE VARIABLE
SET status = CHECK (quelle, READ, TUSTEP)
ERROR/STOP "QUELLE: ", status
SET status = CHECK (ziel, WRITE, TUSTEP)
ERROR/STOP "ZIEL: ", status
ACCESS q: READ/RECORDS "{quelle}" s.z/u, txt, typ
ACCESS z: WRITE/ERASE/RECORDS "{ziel}" s.z/u, txt, nix
SET num = 0
LOOP/999999
READ/NEXT/EXIT q
IF (txt.SW."<Das>") THEN
SET num = num + 1
IF (txt.NC.":<<z>>:") CONTINUE
SET mrk = num, nxt = mrk + 1
LOOP
IF (txt.CT.":<</z>>:") EXIT
WRITE z
READ/NEXT q
SET num = num + 1
ENDLOOP
IF (#num.EQ.#mrk) THEN
SET erg = CONCAT (mrk, ": ")
ELSEIF (#num.EQ.#nxt) THEN
SET erg = CONCAT (mrk, "f: ")
ELSE
SET erg = CONCAT (mrk, "-", num, ": ")
ENDIF
SET apos = SEARCH (txt, ":<<zit>>:", 0, 0, 1, epos)
SET txt = SUBSTITUTE (txt, -, #epos, #epos, erg)
ELSE
SET num = 0
ENDIF
WRITE z
ENDLOOP
ENDACCESS q
ENDACCESS z
Naechsten Satz lesen
Falls Satz mit <Das> beginnt:
Lfd. Nummer der <Das>-Saetze erhoehen
Falls kein <z> vorhanden, fertig, Satz schreiben
Lfd. Nummer von <z> merken, nachfolgende Nummer berechnen
Falls Satz </z> enthaelt, Schleife verlassen
Satz schreiben
Naechsten Satz lesen
Lfd. Nummer erhoehen
Falls lfd. Nummer == gemerkte Nummer
1: ergaenzen
Falls lfd. Nummer == auf gemerkte folgende Nummer
2f: erzaenzen
in allen anderen Faellen
3-4: ergaenzen
Postion nach <zit> feststellen
Nach <zit> einfuegen
Falls Satz nicht mit <Das> beginnt:
Lfd. Nummer zuruecksetzen
Satz schreiben
================================================
Liebe Tustep-Gemeinde,
ich habe ein Problem, an dem ich schon eine Weile knobbele und trotzdem
nicht weiterkomme. In strukturierten Daten (s.u) will ich zählen und
schreiben. Gezählt werden soll im wievielten <Das>-Satz eine
<z>-Stelle anfängt und wo sie aufhört </z>. Diese Werte sollen
anschließend der Quelle zugewiesen werden <Zit>von-bis: ...</Zit>.
(Ich hoffe, ich habe mich nicht vertippt):
Quelle
2.0 <Num>0002</Num>
2.1 <Was>öadf</Was>
2.2 <Was>öbdf</Was>
2.3 <Was>öcdf</Was>
2.4 <Das>dfasd</Das>
2.5 <Das>df<z>stelle1<z> <zit>quelle1</zit>asd</Das>
2.6 <Das>dfasd</Das>
2.7 <Usw>ölkasd</Usw>
4.0 <Num>0004</Num>
4.1 <Was>asdasfasdfas</Was>
4.2 <Was>jkjlkasdflöasf</Was>
4.3 <Was>kajsdflkasdfk</Was>
4.4 <Was>asdasfasdfas</Was>
4.5 <Was>jkjlkasdflöasf</Was>
4.6 <Was>kajsdflkasdfk</Was>
4.7 <Was>asdasfasdfas</Was>
4.8 <Was>jkjlkasdflöasf</Was>
4.9 <Das>ö<z>stelle1</z> <zit>quelle1</zit>kö</Das>
4.10<Das>ökdsöfjaölsdjföf</Das>
4.11<Das>asdkfjö<z>stel</Das>
4.12<Das>le2</z>, <zit>quelle2</zit>sdf</Das>
4.13<Das>öökjölkj</Das>
4.14<Das>asdf<z>stelle</Das>
4.15<Das>immer noch stelle</Das>
4.16<Das>nr 3</z> <zit>quelle3</zit> ööasdf</Das>
4.17<Usw>ö1öö</Usw>
4.18<Usw>ö2öö</Usw>
4.19<Usw>ö3öö</Usw>
70.0<Num>0070</Num>
70.1...
ZIEL
2.0 = 2.0
2.1 = 2.1
2.2 = 2.2
2.3 = 2.3
2.4 = 2.4
2.5 = <Das>df<z>stelle1<z> <zit>2-2: quelle1</zit>asd</Das>
2.6 = 2.6
...
4.9 = <Das>ö<z>stelle1</z> <zit>1-1: quelle1</zit>kö</Das>
4.10= <Das>ökdsöfjaölsdjföf</Das>
4.11= <Das>asdkfjö<z>stel</Das>
4.12= <Das>le2</z>, <zit>3-4: quelle2</zit>sdf</Das>
4.13= <Das>öökjölkj</Das>
4.14= <Das>asdf<z>stelle</Das>
4.15= <Das>immer noch stelle</Das>
4.16= <Das>nr 3</z> <zit>6-8: quelle3</zit> ööasdf</Das>
4.17= <Usw>ö1öö</Usw>
...
Schön wäre dann noch:
IF (von .eq. bis) THEN
2.5 = <Das>df<z>stelle1<z> <zit>2: quelle1</zit>asd</Das>
4.9 = <Das>ö<z>stelle1</z> <zit>1: quelle1</zit>kö</Das>
ELSEIF (bis .eq. von+1) THEN
4.12= <Das>le2</z>, <zit>3f: quelle2</zit>sdf</Das>
ENDIF
Mehr Informationen über die Mailingliste Tustep-Liste