[[tuscript:loesungen:start|Zurück zum Inhaltsverzeichnis - Lösungen und Tipps]]
----
====== Kopieren und Modifizieren von Texteinheiten nach Bedingungen ======
- {{files_open:benutzericons:schneider-lastin-lg.jpg?nolink&16x16|schneider-lastin}} schneider-lastin\\ \\ **Musterdatei:**
\\
\\ {{files_open:daten:philos.tf|philos.tf}} [2 KB]
\\
\\ \\ **Inhalt der Musterdatei:**\\
Text Text ... Text Text ... Text Text ... Text Text ... Text Text ... Text Text ... Text Text ... Text Text ... Text Text ... Text Text ...Sokrates spricht von Tugend.
Platon spricht von Tugend.
Aristoteles spricht von Tugend.
Sokrates, Platon und Aristoteles sprechen von Tugend.
Cicero spricht von Tugend.
Seneca spricht von Tugend.
Cicero und Seneca sprechen von Tugend.
Sokrates, Platon, Aristoteles, Cicero und Seneca sprechen von Tugend.
Tugend ist offenbar ein interessantes Thema.
**Aufgaben:**\\ \\ **1.** Nur die Sätze **kopieren**, die die Philosophen Sokrates, Platon oder Aristoteles enthalten.\\
#makro
$$ MODE TUSCRIPT, {}
- Quelle und Ziel angeben
SET quelle = "philos.tf"
SET status = OPEN (quelle,WRITE,-STD-)
SET ziel = "philos2.tf"
SET status = CREATE (ziel,SEQ-O,-STD-)
SET status = ERASE (ziel)
- Dateizugriff definieren (satzweise kopieren)
ACCESS q: READ /RECORDS "{quelle}" sn.zn/un, text
ACCESS z: WRITE/ERASE/RECORDS "{ziel}" sn.zn/un, text
- Daten kopieren mit Bedingung
LOOP/999999
READ/NEXT/EXIT q
- Bedingung: nur Sätze mit Sokrates, Platon, Aristoteles kopieren
IF (text .CT. "|Sokrates|Platon|Aristoteles|") THEN
WRITE z
ENDIF
ENDLOOP
- Dateizugriff beenden und Meldung ausgeben
ENDACCESS/PRINT q
ENDACCESS/PRINT z
*eof
\\ **2.** Nur die Sätze mit den griechischen Philosophen **kopieren** und dabei Tugend in Arete **austauschen**\\
#makro
$$ MODE TUSCRIPT, {}
- Quelle und Ziel angeben wie bei Aufgabe 1
- Dateizugriff definieren wie bei Aufgabe 1
- Daten kopieren mit Bedingung
LOOP/999999
READ/NEXT/EXIT q
IF (text .CT. "|Sokrates|Platon|Aristoteles|") THEN
SET text = EXCHANGE (text,"|Tugend|Arete|")
WRITE z
ENDIF
ENDLOOP
- Dateizugriff beenden und Meldung ausgeben wie bei Aufgabe 1
*eof
\\ **3.** **Alle** Sätze **kopieren**, dabei in den Sätzen mit griechischen Philosophen Tugend in Arete **austauschen**\\
#makro
$$ MODE TUSCRIPT, {}
- Quelle und Ziel angeben wie bei Aufgabe 1
- Dateizugriff definieren wie bei Aufgabe 1
- Daten kopieren mit Bedingung
LOOP/999999
READ/NEXT/EXIT q
IF (text .CT. "|Sokrates|Platon|Aristoteles|") THEN
SET text = EXCHANGE (text,"|Tugend|Arete|")
ENDIF
WRITE z
ENDLOOP
- Dateizugriff beenden und Meldung ausgeben wie bei Aufgabe 1
*eof
\\ **4.** wie 3., zusätzlich Angaben zum Suchen **als Recherchiertabelle auslagern**\\
#makro
$$ MODE TUSCRIPT, {}
- Quelle und Ziel angeben wie bei Aufgabe 1
- Dateizugriff definieren wie bei Aufgabe 1
- ausgelagerte Angaben zum Recherchieren
BUILD R_TABLE/OR rt1 = *
DATA |Sokrates|Platon|Aristoteles|
- Daten kopieren mit Bedingung
LOOP/999999
READ/NEXT/EXIT q
IF (text .MA. rt1) THEN
SET text = EXCHANGE (text,"|Tugend|Arete|")
ENDIF
WRITE z
ENDLOOP
- Dateizugriff beenden und Meldung ausgeben wie bei Aufgabe 1
*eof
\\ **5.** **Alle** Sätze **kopieren**, jedoch\\ - falls Sätze mit Sokrates oder Platon oder Aristoteles: Tugend in Arete **austauschen**\\ - falls Sätze mit Cicero oder Seneca: Tugend in Virtus **austauschen**\\ - falls beide Gruppen: vor Tugend @@ **einfügen**\\ - sonst: vor Tugend ¿¿ **einfügen**\\
#makro
$$ MODE TUSCRIPT, {}
- Quelle und Ziel angeben wie bei Aufgabe 1
- Dateizugriff definieren wie bei Aufgabe 1
- ausgelagerte Angaben zum Recherchieren
BUILD R_TABLE/OR grie_phil = *
DATA |Sokrates|Platon|Aristoteles|
BUILD R_TABLE/OR roem_phil = *
DATA |Cicero|Seneca|
LOOP/999999
READ/NEXT/EXIT q
IF (text .MA. grie_phil .AND. text .MA. roem_phil) THEN
SET text = EXCHANGE (text,"|Tugend|@@Tugend|")
ELSEIF (text .MA. grie_phil) THEN
SET text = EXCHANGE (text,"|Tugend|Arete|")
ELSEIF (text .MA. roem_phil) THEN
SET text = EXCHANGE (text,"|Tugend|Virtus|")
ELSE
SET text = EXCHANGE (text,"|Tugend|¿¿Tugend|")
ENDIF
WRITE z
ENDLOOP
- Dateizugriff beenden und Meldung ausgeben wie bei Aufgabe 1
*eof
\\
====== Kopieren mit Manipulation der Satznummern ======
- [ osthof | osthof ]\\ \\ **Aufgabe:** Eine Datei, die mehrere Dokumente (etwa Briefe, Urkunden etc.) enthält, soll so umkopiert werden, dass **die Satznummer** sich nach der **Nummer des Dokuments** richtet. Die Dokumentnummern stehen im Text und sind mit Ausgangsdatei Zieldatei
1.1
**Script:**\\
#makro
$$! quelle = qdatei, ziel = zdatei
$$ MODE TUSCRIPT, {}
SET status = CHECK (quelle, READ, TUSTEP)
ERROR/STOP "QUELLE: ", status
SET status = CHECK (ziel, WRITE, TUSTEP)
ERROR/STOP "ZIEL: ", status
SET status = UNIQUE (quelle, ziel)
ERROR/STOP "Datei ", status, " ist mehrfach angegeben"
COMPILE
ACCESS q: READ /RECORDS "{quelle}" sq.zq/uq, text
ACCESS z: WRITE/ERASE/RECORDS "{ziel}" sz.zz/uz, text
LOOP/999999
READ/IGNORE/EXIT q
IF (text.SW."
\\ \\
====== Kopieren mit Abfrage ======
- {{files_open:benutzericons:ms.tru-lg.jpg?nolink&16x16|ms.tru}} ms.tru\\ \\ **Aufgabe:** Innerhalb eines Kopiervorgangs mit einer Austauscheanweisung soll der Benutzer durch **Ja-Nein-Abfrage** entscheiden können, ob am Ende des Ausgabesatz ein **Asteriscus** eingefügt werden soll oder nicht, ob also aus "eingabe" "ausgabe*" oder "ausgabe" werden soll.\\
#MAKRO
$$!
$$ MODE TUSCRIPT, {}
- Quelldatei anmelden, Zieldatei anlegen
q_datei = "quelle"
ERROR/STOP OPEN (q_datei, READ, -STD-)
z_datei = "ziel"
ERROR/STOP CREATE (z_datei, SEQ-O, -STD-)
- TUSTEP-Quelldatei einlesen
txt = FILE (q_datei)
- Benutzerabfrage
ASK "Soll ein Asterisk angefügt werden? (Ja/Nein)", antw=""
- Ausführung mit Fallunterscheidung
- falls Benutzereingabe "ja/j" wird am Datensatzende ein "*" angefügt,
- falls Benutzereingabe "nein/n" wird keine Veränderung vorgenommen
- bei anderen Benutzereingaben erfolgt eine Fehlermeldung
IF (antw .AB. "ja") THEN
BUILD X_TABLE x_ja = "|eingabe|ausgabe*|"
txt = EXCHANGE (txt, x_ja)
FILE/ERASE $z_datei = txt
ELSE IF (antw .AB. "nein") THEN
BUILD X_TABLE x_nein = "|eingabe|ausgabe|"
txt = EXCHANGE (txt, x_nein)
FILE/ERASE $z_datei = txt
ELSE
PRINT "Fehlerhafte Eingabe. Nur _Ja_ oder _Nein_ sind vorgesehen."
END IF
*EOF
**Kombinierte TUSCRIPT-/KOPIERE-Lösungen für die vorstehende Aufgabe finden Sie [[tustep:loesungen:kopieren#Kopieren mit Abfrage|hier]]**\\ \\
====== Austauschen nur innerhalb eines Bereichs ======
- [ MTrauth | MTrauth ]\\ \\ **Aufgabe:** In einem Text sollen die Tags **** und **** in **** und **** ausgetauscht werden, jedoch **nur** zwischen **#makro
$$! quelle=quelldatei, ziel=zieldatei
$$ MODE TUSCRIPT, {}
SET status = CHECK (quelle, READ, TUSTEP)
ERROR/STOP "QUELLE: ", status
SET status = CHECK (ziel, WRITE, TUSTEP)
ERROR/STOP "ZIEL: ", status
COMPILE
BUILD S_TABLE atab = ":
\\
====== Ersetzen nach Bedingungen ======
- {{files_open:benutzericons:kollatz-lg.jpg?nolink&16x16|kollatz}} kollatz
\\
\\ {{files_open:daten:vglliste.tf|vglliste.tf}} [2 KB]
\\
\\ \\ **Aufgabe:** Eine Liste mit Jahreszahlen soll so umkopiert werden, dass nachfolgende **gleiche Jahreszahlen unterdrückt** werden.\\ \\ **Ausgangssituation: linke Spalte -- Ergebnis: rechte Spalte**\\
**Skript**\\
$$ MODE TUSCRIPT,{}
SET quelle = "vglliste.tf"
SET status = OPEN (quelle,WRITE,-STD-)
SET ziel = "ergliste"
SET status = CREATE (ziel,SEQ-T,-STD-)
SET status = ERASE (ziel)
jahrzahl=0,substitut=" "
ACCESS q: READ/RECORDS $quelle s.z/u, zeile
ACCESS z: WRITE/RECORDS $ziel s.z/u, zeile
LOOP/99999999
READ/NEXT/EXIT q
jahr=EXTRACT (zeile,":
\\
====== Ersetzen nach Bedingungen 2: Überschriften nummerieren ======
\\ - [ re.to | re.to ] Skript erstellt von CG\\
| vorher\\ | nachher\\ |
|
#MAKRO
$$ MODE TUSCRIPT,{}
- Quelle und Ziel definieren
SET quelle = "?1"
SET ziel = "?2"
SET anzahl = "?3"
SET status = OPEN ("{quelle}",READ,-STD-)
SET status = CREATE ("{ziel}",SEQ-O,-STD-)
SET status = ERASE ("{ziel}")
- Zähler für alle Ebenen einrichten
LOOP i = 1, anzahl, 1
SET nr_{i} = 0
ENDLOOP
- Dateizugriff definieren (satzweise kopieren)
ACCESS q: READ /RECORDS "{quelle}" sn.zn/un, text
ACCESS z: WRITE/ERASE/RECORDS "{ziel}" sn.zn/un, text
- Schleife über alle Datensätze
LOOP/999999
- Datensatz lesen
READ/NEXT/EXIT q
- Schleife über alle Ebenen
LOOP i = 1, anzahl, 1
- Wenn Überschrift im Text vorkommt
IF (text .CT. "||") THEN
- Zähler hochzählen
SET nr_{i} += 1
IF (i < anzahl) THEN
- Zähler für alle tieferen Ebenen auf null setzen
SET start = i + 1
LOOP j = start, anzahl, 1
SET nr_{j} = 0
ENDLOOP
ENDIF
- Zähler für alle höheren Ebenen einfügen
LOOP k = i, 1, -1
SET string = nr_{k}
IF (k == i) THEN
- Unterste Ebene mit Leerzeichen einfügen
SET text = EXCHANGE (text,"|\|\{string}. |")
ELSE
- Alle anderen Ebenen ohne Leerzeichen einfügen
SET text = EXCHANGE (text,"|\|\{string}.|")
ENDIF
ENDLOOP
ENDIF
ENDLOOP
- Datensatz in neue Datei schreiben
WRITE z
ENDLOOP
- Dateizugriff beenden
ENDACCESS q
ENDACCESS z
*eof
\\ \\
====== Leerzeilen einfügen ======
- [ schaelkle | schaelkle ]\\ \\ **Aufgabe:** In einem Text soll eine Leerzeile eingefügt werden a) **vor** allen Sätzen, die **mit einer bestimmten Zeichenfolge beginnen**, oder b) eine Leerzeile **nach** allen Sätzen, die **mit eine bestimmten Zeichenfolge enden**.\\ → Diese Funktion erledigen in #KOPIERE die Parameter LZV bzw. LZN.\\ \\ **Lösung a) Für Fremddatenformate (= Systemdateien):**\\
ACCESS q: READ /RECORDS "{quelle}" n, text
ACCESS z: WRITE/ERASE/RECORDS "{ziel}" n, text
LOOP/999999
READ/NEXT/EXIT q
- a) vor allen Sätzen, die mit einer Zeichenfolge beginnen (Start with)
IF (text.SW."v1","v2") WRITE/NEXT z ""
WRITE/NEXT z
- b) nach allen Sätzen, die mit einer Zeichenfolge enden (End with)
IF (text.EW."n1","n2") WRITE/NEXT z ""
ENDLOOP
ENDACCESS/PRINT q
ENDACCESS/PRINT z
Die Abfragen können auch mit S_TABLEs erfolgen, z.B.\\
IF (text.CT.":{[}v1:{[}v2:") WRITE/NEXT z ""
...
IF (text.CT.":n1{]}:n2{]}:") WRITE/NEXT z ""
oder auch mit R_TABLEs, z.B.\\
IF (text.MA.":v1*:v2*:") WRITE/NEXT z ""
...
IF (text.MA.":*n1:*n2:") WRITE/NEXT z ""
\\ \\ **Lösung b) Für TUSTEP-Dateien:**\\ \\
ACCESS q: READ /RECORDS "{quelle}" n, text
ACCESS z: WRITE/ERASE/RECORDS "{ziel}" n, text
LOOP/999999
READ/IGNORE/EXIT q
- a) vor allen Sätzen, die mit einer Zeichenfolge beginnen (Start with)
IF (text.SW."v1","v2") WRITE/ADJUST z ""
WRITE/ADJUST z
- b) nach allen Sätzen, die mit einer Zeichenfolge enden (End with)
IF (text.EW."n1","n2") WRITE/ADJUST z ""
ENDLOOP
ENDACCESS/PRINT q
ENDACCESS/PRINT z
\\ Hinweis:\\ READ/NEXT liest in einer TUSTEP-Datei den Satz, dessen Satznummer auf die aktuelle (in den entsprechenden Variablen stehende) Satznummer folgt.\\ WRITE/NEXT erhöht diese Satznummer und somit wird (falls die Satznummern keine Lücken haben) beim nächsten READ/NEXT nicht der nächste, sondern der übernächste Satz gelesen. Entsprechend würde bei der Verwendung von READ/NEXT zusammen mit WRITE/NEXT nur jeder zweite Datensatz in die Zieldatei geschrieben. Aus diesem Grund ist die Modifikation zu WRITE/ADJUST notwendig.\\ Auch bei TUSTEP-Dateien können die verschiedenen o.g. Auswahlmöglichkeiten über R_TABLES, S_TABLES usw. genutzt werden.\\ \\
====== Zahlen zusammenfassen ======
- [ schaelkle | schaelkle ]\\ \\ **Aufgabe:** In einem Register sollen wie folgt Zahlen zusammengefasst werden:\\
Eintrag1 _ 23 35 36 37 38 59 112 113 117 118 119 127 128 134 135 136 137 138
soll umgewandelt werden in:\\
Eintrag1 _ 23 35-38 59 112f. 117ff. 127f. 134-138
**NB:** Bei der Registererstellung mit den Modulen "#rv", "#so", "#ra" kann im Modul "#ra" mit den Parametern "RFF", "F1", "F2", "F3" die Zusammenfassung von Referenzen und die Ergänzung von "f." und "ff." gesteuert werden.\\ \\ **Lösung mit TUSCRIPT:**\\
ACCESS q: READ /RECORDS "{quelle}" sn.zn/un, zeile
ACCESS z: WRITE/ERASE/RECORDS "{ziel}" sn.zn/un, zeile
LOOP/999999
READ/NEXT/EXIT q
- Zeile in Text und Referenzen aufteilen
SET egal = SPLIT (zeile, ": _ :", text, referenzen)
- Blanks zwischen den Zahlen durch Apostroph ersetzen
SET referenzen = EXCHANGE (referenzen, ": :':")
- Seitenzahlen zusammenfassen
SET referenzen = COMBINE (referenzen, "f.", "ff.")
- Apostrophe wieder durch Blanks ersetzen
SET referenzen = EXCHANGE (referenzen, ":': :")
- Zeile aus Text und Referenzen wieder zusammenhängen
SET zeile = CONCAT (text, " _ ", referenzen)
WRITE z
ENDLOOP
ENDACCESS/PRINT q
ENDACCESS/PRINT z
\\
====== Leere Zeilen aus Sternvariablen entfernen ======
- [ schaelkle | schaelkle ]- {{files_open:benutzericons:ms.tru-lg.jpg?nolink&16x16|ms.tru}} ms.tru\\ \\ **Aufgabe:** Aus einer Sternvariablen (= einer Variablen, die mehrere Zeilen enthält), sollen alle leeren Zeilen entfernt werden. Zum Testen kann der nachfolgende Text in eine TUSTEP-Datei (z.B. "testtxt.tf") kopiert und das u.g. Skript angewendet werden.\\
\\ (Lösung nach Beiträgen auf der ITUG-Mailingliste:\\ https://lists.uni-wuerzburg.de/pipermail/tustep-liste/2008-May/001650.html,\\ https://lists.uni-wuerzburg.de/pipermail/tustep-liste/2008-May/001654.html)\\ \\ Beispieldaten:\\
Hier
steht
ein Text
in mehreren
Zeilen mit Leerzeilen dazwischen.
\\ Beispielskript:\\
$$! quelle = "testtxt.tf", ziel = "testziel.tf"
$$ MODE TUSCRIPT,{}
- Daten in die Variable txt einlesen
SET txt = FILE(quelle)
- Datensätze ohne Inhalt (= Leerzeilen) werden
- aus der Sternvariablen herausgefiltert.
SET txt = FILTER (txt, -, "::")
- Daten in Zieldatei ausgeben
FILE/ERASE $ziel = txt
\\ \\
----
[[tuscript:loesungen:start|Zurück zum Inhaltsverzeichnis - Lösungen und Tipps]]