Zurück zum Inhaltsverzeichnis - Lösungen und Tipps
- schneider-lastin
Musterdatei:
philos.tf [2 KB]
Inhalt der Musterdatei:
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
- [ 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 <nr>…</nr> getaggt, sie sind aufsteigend, aber nicht fortlaufend. Die Zeilennumer soll mit 0 beginnen.
Vorteile: 1. Ein Dokument kann im Editor gezielt aufgerufen/angezeigt werden; 2. die Satznummern können für die Erstellung von Arbeitsregistern als Referenzen ausgewertet werden.
Ausgangsdatei Zieldatei 1.1 <nr>1</nr> 1.0 <nr>1</nr> 1.2 <p>Text Text ...</p> 1.1 <p>Text Text ...</p> 1.3 <nr>2</nr> 2.0 <nr>2</nr> 1.4 <p>Text Text ...</p> 2.1 <p>Text Text ...</p> 1.5 <nr>5</nr> 5.0 <nr>5</nr> 1.6 <p>Text Text ...</p> 5.1 <p>Text Text ...</p> 1.7 <p>Text Text ...</p> 5.2 <p>Text Text ...</p> 1.8 <nr>13</nr> 13.0 <nr>13</nr> 1.9 <p>Text Text ...</p> 13.1 <p>Text Text ...</p>
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."<nr>") THEN sz = EXTRACT (text, 5, ".<.") zz = 0 ENDIF WRITE/ADJUST z ENDLOOP ENDACCESS/PRINT q ENDACCESS/PRINT z ENDCOMPILE *eof
- 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 hier
- [ MTrauth | MTrauth ]
Aufgabe: In einem Text sollen die Tags <a> und </a> in <b> und </b> ausgetauscht werden, jedoch nur zwischen <fn>…</fn> (also z.B. innerhalb von Fußnoten). Überall sonst im Text sollen sie nicht ausgetauscht werden.
Ausgangssituation:
Dies ist der laufende <a>Text</a>.<fn>Dies ist eine <a>Fußnote</a> zu diesem Satz.</fn>
Ergebnis:
Dies ist der laufende <a>Text</a>.<fn>Dies ist eine <b>Fußnote</b> zu diesem Satz.</fn>
Skript:
#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 = ":<fn>:" BUILD S_TABLE etab = ":</fn>:" BUILD X_TABLE x1 = ":<a>:<b>:</a>:</b>:" ACCESS q: READ/STREAM/RECORDS "{quelle}" ... s.z/u, anf/atab + txt + end/etab, typ ACCESS z: WRITE/ERASE/STREAM "{ziel}" ... s.z/u, anf + txt + end, anz SET mrk = "" LOOP/999999 READ q IF (EOF) EXIT IF (anf .NE. "") SET mrk = anf IF (mrk .EQ. "<fn>") THEN SET txt = EXCHANGE (txt, x1) ENDIF IF (end .NE. "") SET mrk = "" WRITE z ENDLOOP END COMPILE ENDACCESS/PRINT q ENDACCESS/PRINT z *eof
- kollatz
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
<j>1963</j> <t>...</t> <j>1963</j> <t>...</t> <j>1963</j> <t>...</t> <t>...</t> <j>1974</j> <t>...</t> <j>1974</j> <t>...</t> <j>1983</j> <t>...</t> <j>1983</j> <t>...</t> <j>1983</j> <t>...</t> <t>...</t> <j>1983</j> <t>...</t> <t>...</t> <j>1991</j> <t>...</t> <j>1991</j> <t>...</t> <j>1996</j> <t>...</t> <j>1996</j> <t>...</t>
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,":<j>:"|,":</j>:") IF (jahr==jahrzahl) zeile=SUBSTITUTE (zeile,-,":<j>:",":</j>:"|, substitut) jahrzahl=VALUE(jahr) WRITE z ENDLOOP ENDACCESS/PRINT q ENDACCESS/PRINT z
- [ re.to | re.to ] Skript erstellt von CG
vorher | nachher |
<h1>Einleitung</h1 <h2>Hinführung zum Thema</h2> <h2>Forschungsstand</h2> <h3>18. Jahrhundert</h3> <h3>19. Jahrhundert</h3> <h3>20. Jahrhundert</h3> <h4>Hier kommen Unterpunkte</h4> <h4>Noch ein Unterpunkt</h4> <h2>Methodik</h2> | <h1>1. Einleitung</h1 <h2>1.1. Hinführung zum Thema</h2> <h2>1.2. Forschungsstand</h2> <h3>1.2.1. 18. Jahrhundert</h3> <h3>1.2.2. 19. Jahrhundert</h3> <h3>1.2.3. 20. Jahrhundert</h3> <h4>1.2.3.1. Hier kommen Unterpunkte</h4> <h4>1.2.3.2. Noch ein Unterpunkt</h4> <h2>1.3. Methodik</h2> |
Das folgende Script akzeptiert 3 Parameter: Input-Datei, Output-Datei, Anzahl der Nummerierungsebenen
Beispiel-Aufruf mit #TUE:
#T, hnumm.mkr, param=vorher'nachher'4
#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. "|<h{i}>|") 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,"|\<h{i}\>|\<h{i}\>{string}. |") ELSE - Alle anderen Ebenen ohne Leerzeichen einfügen SET text = EXCHANGE (text,"|\<h{i}\>|\<h{i}\>{string}.|") ENDIF ENDLOOP ENDIF ENDLOOP - Datensatz in neue Datei schreiben WRITE z ENDLOOP - Dateizugriff beenden ENDACCESS q ENDACCESS z *eof
- [ 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.
- [ 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
- [ schaelkle | schaelkle ]- 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