[[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:**\\ 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 **al​s 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 ... 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 1 1.0 1 1.2

Text Text ...

1.1

Text Text ...

1.3 2 2.0 2 1.4

Text Text ...

2.1

Text Text ...

1.5 5 5.0 5 1.6

Text Text ...

5.1

Text Text ...

1.7

Text Text ...

5.2

Text Text ...

1.8 13 13.0 13 1.9

Text Text ...

13.1

Text Text ...

**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."") THEN sz = EXTRACT (text, 5, ".<.") zz = 0 ENDIF WRITE/ADJUST z ENDLOOP ENDACCESS/PRINT q ENDACCESS/PRINT z ENDCOMPILE *eof \\ \\ ====== 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 **...** (also z.B. innerhalb von Fußnoten). Überall sonst im Text sollen sie **nicht** ausgetauscht werden.\\ **Ausgangssituation:**\\ Dies ist der laufende Text.Dies ist eine Fußnote zu diesem Satz. **Ergebnis:**\\ Dies ist der laufende Text.Dies ist eine Fußnote zu diesem Satz. **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 = "::" BUILD S_TABLE etab = "::" BUILD X_TABLE x1 = ":::::" 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. "") THEN SET txt = EXCHANGE (txt, x1) ENDIF IF (end .NE. "") SET mrk = "" WRITE z ENDLOOP END COMPILE ENDACCESS/PRINT q ENDACCESS/PRINT z *eof \\ ====== 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**\\ 1963 ... 1963 ... 1963 ... ... 1974 ... 1974 ... 1983 ... 1983 ... 1983 ... ... 1983 ... ... 1991 ... 1991 ... 1996 ... 1996 ... **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,"::"|,"::") IF (jahr==jahrzahl) zeile=SUBSTITUTE (zeile,-,"::","::"|, substitut) jahrzahl=VALUE(jahr) WRITE z ENDLOOP ENDACCESS/PRINT q ENDACCESS/PRINT z \\ ====== Ersetzen nach Bedingungen 2: Überschriften nummerieren ====== \\ - [ re.to | re.to ] Skript erstellt von CG\\ | vorher\\ | nachher\\ | |

EinleitungHinführung zum Thema

\\

Forschungsstand

\\

18. Jahrhundert

\\

19. Jahrhundert

\\

20. Jahrhundert

\\

Hier kommen Unterpunkte

\\

Noch ein Unterpunkt

\\

Methodik

\\ |

1. Einleitung1.1. Hinführung zum Thema

\\

1.2. Forschungsstand

\\

1.2.1. 18. Jahrhundert

\\

1.2.2. 19. Jahrhundert

\\

1.2.3. 20. Jahrhundert

\\

1.2.3.1. Hier kommen Unterpunkte

\\

1.2.3.2. Noch ein Unterpunkt

\\

1.3. Methodik

\\ | 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. "||") 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]]