Inhaltsverzeichnis

Zurück zum Inhaltsverzeichnis - Lösungen und Tipps


Kopieren und Modifizieren von Texteinheiten nach Bedingungen

- schneider-lastin 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 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 <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



Kopieren mit Abfrage

- 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 hier

Austauschen nur innerhalb eines Bereichs

- [ 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


Ersetzen nach Bedingungen

- kollatz 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


Ersetzen nach Bedingungen 2: Überschriften nummerieren


- [ 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



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 ]- 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




Zurück zum Inhaltsverzeichnis - Lösungen und Tipps