Itug Forum

Normale Version: Informationen aus einem späteren Datensatz in einen früheren Datensatz einfügen
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Folgende Problemstellung wurde gemeldet:

Es liegt eine TUSTEP-Datei in folgender Form vor:

Code:
<eins>{#}</eins><zwei></zwei>
<eins>{#}</eins><zwei></zwei>
<eins>{#}</eins><zwei></zwei>
<eins>{#}</eins><zwei></zwei>

Nun soll in jeder Zeile in den zweiten Tag die Nummer des ersten Tags der folgenden Zeile eingetragen werden, ohne dass sonst etwas an den Datensätzen geändert wird. In der letzten Zeile soll nichts eingetragen werden, z. B.:

Code:
<eins>1</eins><zwei>2</zwei>
<eins>2</eins><zwei>3</zwei>
<eins>3</eins><zwei>4</zwei>
<eins>4</eins><zwei></zwei>

Lösungsweg:

Die Datei wird zeilenweise von hinten nach vorne gelesen und die zu schreibende Nummer im Zwischenspeichert gemerkt.
Im ersten Satz von hinten wird nichts eingetragen, ab da die jeweils gemerkte Nummer:

Code:
#MAKRO
$$ MODE TUSCRIPT, {}
SET quelle = "Hier der Name der Quelldatei"
SET ziel = "Hier der Name der Zieldatei"
SET daten = FILE(quelle)

- Wir drehen die Reihenfolge der Datensätze um, lesen also von hinten nach vorne
SET daten = REVERSE(daten)

- Wir suchen eine Zahl, die zwischen <eins> und </eins> steht
- {[} = linker Rand; {]} = rechter Rand
BUILD S_TABLE s1 = "|<eins>{[}{#}{]}</eins>|"

- Schleife über alle Datensätze (Zeilen)
- Bei jedem Durchgang wird die aktuelle Zeile aus der Variable daten
- gelöscht (LOOP/CLEAR), die Nummer eingesetzt und dann die so geänderte Zeile
- wieder hinzugefügt. Dadurch spart man sich den Speicher für eine zweite
- Sternvariable.
SET nummer = ""
LOOP/CLEAR zeile = daten
   BUILD X_TABLE x1 = "|<zwei></zwei>|<zwei>{nummer}</zwei>|"
   SET zeile = EXCHANGE(zeile, x1)
   RELEASE X_TABLE x1
   SET daten = APPEND(daten, zeile)

   - Die Nummer wird für den nächsten Durchgang extrahiert
   SET von = SEARCH(zeile, s1, 0, 0, 1, bis)
   SET nummer = EXTRACT(zeile, #von, #bis)
ENDLOOP

- Wir drehen die Reihenfolge wieder und schreiben in die Zieldatei
SET daten = REVERSE(daten)
FILE/ERASE ziel = daten
*eof

Komplexität des Algorithmus (vgl. Landau-Notation)
Die Laufzeit beträgt O(n), da alle n Datensätze jeweils einmal gelesen werden müssen.
Der Speicherverbrauch beträgt O(1), da nur konstant viel Speicher belegt wird.