Itug Forum Das TUSTEP-Forum der ITUG TUSCRIPT Daten aus einer TUSTEP-Datei auf mehrere Fremd-Dateien aufteilen

Daten aus einer TUSTEP-Datei auf mehrere Fremd-Dateien aufteilen

Daten aus einer TUSTEP-Datei auf mehrere Fremd-Dateien aufteilen

07.02.26, 09:45 PM
#1
Gegeben sei eine TEI-Korpus-Datei, die ungefähr folgende Struktur aufweist.
Die Datei ist formatiert und enthält die einzelnen Start- und Endetags für
die Hierarchieebenen jeweils auf einer neuen Zeile:

Code:

<teiCorpus>
    <TEI>
        <!-- Hier das erste TEI-Dokument -->
        ...
    </TEI>
    <TEI>
        <!-- Hier das zweite TEI-Dokument -->
        ...
    </TEI>
</teiCorpus>

Gewünscht ist, dass die einzelnen TEI-Dokumente (alles zwischen <TEI> und </TEI>) in eigene Dateien geschrieben werden.

Vorgehen zum Lösen des Problems: 
Die Datei wird zeilenweile gelesen.
Bei Beginn eines TEI-Dokuments wird mithilfe eines Zählers eine neue Zieldatei angelegt.
Der Inhalt des TEI-Dokuments wird in einer Sternvariable zwischengespeichert.
Beim Ende eines TEI-Dokuments wird in die Zieldatei geschrieben.

Hier ein Musterprogramm zur Lösung:
Code:

#MAKRO
$$ MODE TUSCRIPT, {}
SET quelle = "Hier der Name der Quelldatei"
SET präfix = "Hier das Präfix der Zieldateien"

- Benötigte Variablen
SET n = 0
SET tmp = *
SET ziel = ""

- Anfang und Ende der TEI-Dokumente
BUILD S_TABLE start = "|<TEI |"
BUILD S_TABLE ende = "|</TEI>|"

- Schleife über alle Zeilen der Datei
- Es sollen mindestens eine Millionen Datensätze
- verarbeitet werden, bei Bedarf diesen Wert erhöhen.
ACCESS daten: READ/RECORDS $quelle, s.z/u, zeile
LOOP/1000001
  
   - Es wird bei jedem Schleifendurchlauf ein
   - neuer Datensatz eingelesen, bis zum Ende
   - der Datei (oder bis zur Grenze der Schleife)
   READ/NEXT/EXIT daten
  
   - Wenn ein neues TEI-Dokument beginnt,
   - die Sternvariable tmp für den Inhalt
   - der nächsten Datei leeren, hochzählen
   - und die neue Datei erstellen
   IF (zeile .CT. start) THEN
      SET tmp = *
      SET n = n + 1
      SET n = CENTER(n, +3, "0")
      SET ziel = "{präfix}_{n}.xml"
      SET status = CREATE($ziel, FDF-O)
   ENDIF

   - Die neue Zeile der Sternvariable hinzufügen
   SET tmp = APPEND(tmp, zeile)

   - Wenn das TEI-Dokument endet,
   - den Inhalt in die neue Datei schreiben
   IF (zeile .CT. ende) THEN
      FILE/ERASE/UTF8 ziel = tmp
   ENDIF

ENDLOOP
ENDACCESS 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(n), da im Worst-Case-Szenario die Quelldatei in den
Zwischenspeicher kopiert wird.


Anmerkung: Wenn Speicherplatz ein Problem darstellt, kann auf das Zwischenspeichern
der Dokumentinhalte in einer Sternvariable verzichtet werden und jede Zeile direkt in
die jeweils neue Datei geschrieben werden. Der Speicherverbrauch wäre dann O(1),
weil nur konstant viel Speicher belegt wird. Allerdings kann dies zu einer erheblichen
Laufzeitverlängerung führen, da nun die Zeilen einzeln statt blockweise geschrieben
werden. Die Laufzeitkomplexität beträgt zwar immer noch O(n), allerdings benötigen
die einzelnen Schreibprozesse mehr Zeit.
ChristianSonder
07.02.26, 09:45 PM #1

Gegeben sei eine TEI-Korpus-Datei, die ungefähr folgende Struktur aufweist.
Die Datei ist formatiert und enthält die einzelnen Start- und Endetags für
die Hierarchieebenen jeweils auf einer neuen Zeile:

Code:

<teiCorpus>
    <TEI>
        <!-- Hier das erste TEI-Dokument -->
        ...
    </TEI>
    <TEI>
        <!-- Hier das zweite TEI-Dokument -->
        ...
    </TEI>
</teiCorpus>

Gewünscht ist, dass die einzelnen TEI-Dokumente (alles zwischen <TEI> und </TEI>) in eigene Dateien geschrieben werden.

Vorgehen zum Lösen des Problems: 
Die Datei wird zeilenweile gelesen.
Bei Beginn eines TEI-Dokuments wird mithilfe eines Zählers eine neue Zieldatei angelegt.
Der Inhalt des TEI-Dokuments wird in einer Sternvariable zwischengespeichert.
Beim Ende eines TEI-Dokuments wird in die Zieldatei geschrieben.

Hier ein Musterprogramm zur Lösung:
Code:

#MAKRO
$$ MODE TUSCRIPT, {}
SET quelle = "Hier der Name der Quelldatei"
SET präfix = "Hier das Präfix der Zieldateien"

- Benötigte Variablen
SET n = 0
SET tmp = *
SET ziel = ""

- Anfang und Ende der TEI-Dokumente
BUILD S_TABLE start = "|<TEI |"
BUILD S_TABLE ende = "|</TEI>|"

- Schleife über alle Zeilen der Datei
- Es sollen mindestens eine Millionen Datensätze
- verarbeitet werden, bei Bedarf diesen Wert erhöhen.
ACCESS daten: READ/RECORDS $quelle, s.z/u, zeile
LOOP/1000001
  
   - Es wird bei jedem Schleifendurchlauf ein
   - neuer Datensatz eingelesen, bis zum Ende
   - der Datei (oder bis zur Grenze der Schleife)
   READ/NEXT/EXIT daten
  
   - Wenn ein neues TEI-Dokument beginnt,
   - die Sternvariable tmp für den Inhalt
   - der nächsten Datei leeren, hochzählen
   - und die neue Datei erstellen
   IF (zeile .CT. start) THEN
      SET tmp = *
      SET n = n + 1
      SET n = CENTER(n, +3, "0")
      SET ziel = "{präfix}_{n}.xml"
      SET status = CREATE($ziel, FDF-O)
   ENDIF

   - Die neue Zeile der Sternvariable hinzufügen
   SET tmp = APPEND(tmp, zeile)

   - Wenn das TEI-Dokument endet,
   - den Inhalt in die neue Datei schreiben
   IF (zeile .CT. ende) THEN
      FILE/ERASE/UTF8 ziel = tmp
   ENDIF

ENDLOOP
ENDACCESS 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(n), da im Worst-Case-Szenario die Quelldatei in den
Zwischenspeicher kopiert wird.


Anmerkung: Wenn Speicherplatz ein Problem darstellt, kann auf das Zwischenspeichern
der Dokumentinhalte in einer Sternvariable verzichtet werden und jede Zeile direkt in
die jeweils neue Datei geschrieben werden. Der Speicherverbrauch wäre dann O(1),
weil nur konstant viel Speicher belegt wird. Allerdings kann dies zu einer erheblichen
Laufzeitverlängerung führen, da nun die Zeilen einzeln statt blockweise geschrieben
werden. Die Laufzeitkomplexität beträgt zwar immer noch O(n), allerdings benötigen
die einzelnen Schreibprozesse mehr Zeit.

Benutzer, die gerade dieses Thema anschauen:
 1 Gast/Gäste
Benutzer, die gerade dieses Thema anschauen:
 1 Gast/Gäste