|
|
|||
| 04.12.2025 | Archiv # Recherche # Links # Kontakt # Gästebuch # Impressum | |||
|
Index Login Die Anzeige des Archivs erfolgt grafisch. Ändern |
GeoTools - Die TextkonvertierungDie Textkonvertierung Wie aus Anfragen ersichtlich ist, bereitet die Logik der Textkonvertierung gelegentlich einiges Kopfzerbrechen. Deshalb möchte ich hier einige Hinweise geben, die das Ganze vielleicht etwas anschaulicher machen. Für Programmierer unter den Lesern eventuell interessant sind die Auszüge aus dem Originallisting dieses Moduls der GeoTools; sie sind kein Geheimnis und Sie können sie gern für eigene Programme benutzen. Da dieser Teil der GeoTools in PowerBASIC programmiert wurde, dürfte es wohl kaum Verständnisschwierigkeiten geben.
Ziel der Konvertierung ist, den Text in folgender Form nach GeoWrite zu bekommen, um dann mit den Möglichkeiten von GeoWrite die Formatierungen korrekt vornehmen zu können.
Programmiertechnisch fällt es leicht, Zeilenendschaltungen zu entfernen: Die Ausgangsdatei wird im INPUT-Modus geöffnet und Zeile für Zeile eingelesen, wobei die Zeilenendmarken bereits rausfallen. Geschrieben wird dann die konvertierte Zeile im BINARY-Modus, mit dem man eine direkte Steuerungsmöglichkeit bezüglich der CR/LF-Codes besitzt. Listing Teil 1
OPEN datei$ FOR INPUT AS #1
'öffnen der Quelldatei
OPEN dateineu$ FOR BINARY AS #2
'Anlegen der Zieldatei
IF option$(6) = "J" THEN PUT$ #2, CHR$(0)
'Nullbyte für externe Konvertierung
DO WHILE NOT EOF(1)
'Start der Bearbeitungsschleife
LINE INPUT #1, zeile$
Wenn die Option externe Zeichenumwandlung gewählt wurde (option$(6)), muss die neue Datei mit einem Null-Byte beginnen, um die interne Konvertierung von GeoWrite auszuschalten.
Text-Konvertierungs-Optionen
Zeilenschaltung entfernen J option$(1)
Leerzeile zwischen Absätzen N option$(2)
führende Leerschritte > Tab 0 option$(3)
mittlere Leerschritte > Tab J option$(4)
feste Seitenumbrüche entfernen N option$(5)
externe Zeichenumwandlung J option$(6)
Die einzelnen Konvertierungsoptionen sind in einer Tabelle mit der Bezeichnung Option$() abgelegt und werden vom Programm nacheinander abgefragt. Listing Teil 2
IF UPPER$(option$(3)) = "J" THEN
'führende Leerzeichen sollen zu Tabs werden
leerzaehler% = 0
WHILE MID$(zeile$, leerzaehler% + 1, 1) = SPACE$(1)
INCR leerzaehler%
LOOP
leerzaehler% = leerzaehler% \ 5
zeile$ = STRING$(leerzaehler%, 9) + LTRIM$ (zeile$)
'pro 5 Leerschritte ein Tab
ELSEIF option$(3) = "0" THEN
'führende Leerzeichen sind zu eliminieren
zeile$ = LTRIM$(zeile$)
END IF
Erst wenn störende führende Leerschritte entfernt sind, kann die Zeilenende-Prüfung einsetzen.
Listing Teil 3
IF UPPER$(option$(1)) = "J" THEN
IF zeile$ = "" THEN
'Das ist offenbar eine Leerzeile.
IF absatz% THEN EXIT IF
'Ausstieg, weil schon ein Absatz besteht.
absatz% = -1
'Merker setzen, daß ein Absatz eingefügt wurde.
zeile$ = CHR$(13, 10)
'Absatzcode wird eingefügt.
IF UPPER$(option$(2)) = "J" THEN
zeile$ = CHR$(13, 10) + zeile$
'Nur in dieser Abfrage taucht die Option
"Leerzeile zwischen Absätzen" auf, eingeschachtelt
in das Entfernen von Zeilenschaltungen, denn nur
hier ist sie sinnvoll. Es ist nicht möglich,
zusätzliche Leerzeilen per Konvertierung einzuziehen.
ELSEIF zeile$ = CHR$(12) THEN
'Hier ist ein fester Seitenumbruch gefunden worden.
IF absatz% THEN zeile$ = ""
'Wenn schon ein Absatz eingezogen wurde, ist nichts
zu veranlassen....
ELSE
zeile$ = SPACE$(1)
'anderenfalls mal eben ein Leerzeichen einfügen.
END IF
ELSE
'Hier endlich der Normalfall. Jetzt wird geprüft,
ob nicht aufgrund der folgenden Zeichen doch ein
Zeilenwechsel vorzunehmen ist.
zeile$ = RTRIM$(zeile$)
IF RIGHT$(zeile$, 1) <> "-" THEN zeile$ =
zeile$ + SPACE$(1)
IF NOT absatz% THEN IF MID$(zeile$, 2, 1) = ")"
OR
INSTR(LEFT$(zeile$, 1), ANY CHR$(9, 32, 45)) THEN
zeile$ = CHR$(13, 10) + zeile$
ELSEIF
INSTR("0123456789", LEFT$(zeile$, 1)) <> 0
AND
INSTR(LEFT$(zeile$, 5), ".") <> 0 THEN
zeile$ = CHRS(13, 10) + zeile$
END IF
END IF
absatz% = 0
'Nun noch vermerken, daß die letzte Zeile nicht
mit einem Absatz schloß...
END IF
ELSE
zeile$ = CHR$(13, 10) + zeile$
'Und zu guter Letzt die Übernahme ohne Entfernung der
Zeilenschaltung, wenn option$(l) <> "J" ist.
END IF
Damit ist die erste Hürde schon mal genommen. Was jetzt noch kommt, ist nicht weiter problematisch und geht auch brav in der Reihenfolge der Options-Nummern vonstatten. An vierter Stelle steht die Umwandlung von Leerschritten innerhalb einer Zeile (mit der Möchtgern-Texter eine sogenannte Formatierung herzustellen gedenken) in einen Tab-Sprung. Nichts leichter als das, denn das Programm prüft eben mal, ob Folgen von Leerzeichen in der aktuellen Zeile auftreten. Die Verschachtelung der Schleifen ist notwendig, weil man ja nie weiß, wieviele blanks wie oft in einer Zeile drinsein könnten.
Listing Teil 4
IF UPPER$(option$(4)) = "J" THEN
WHILE INSTR (zeile$, SPACE$(3))
leerzaehler% = INSTR(zeile$, SPACE$(3))
WHILE MID$(zeile$, leerzaehler%, 1) = SPACE$(1)
zeile$ = LEFT$(zeile$, leerzaehler% -1)_
+
RIGHT$(zeile$, LEN(zeile$) leerzaehler%)
LOOP
zeile$ = LEFT$(zeile$, leerzaehler% - 1) + CHR$(9) +
RIGHT$(zeile$, LEN(zeile$) - leerzaehler% + 1)
LOOP
END IF
Ganz simpel ist das Entfernen fester Seitenumbrüche:
Listing Teil 5 IF UPPER$(option$(5)) = "J" AND zeile$ = CHR$(12) THEN zeile$ = "" Jetzt kommt der zweite wichtige Aspekt der Konvertierung, das externe Umwandeln von Zeichen. Auslöser für die Programmierung dieser Funktion war das eigenwillige Verhalten des GeoWorks-Imports gegenüber dem §-Zeichen. Nun ja, dann kamen immer noch weitere Ideen hinzu, z.B. die in GeoWorks enthaltenen Sonderzeichen, die in ASCII fehlen und umgekehrt. Als letzte Konvertierung wurde dann noch die Schweizer-Option "angestrickt". Listing Teil 6
IF UPPER$(option$(6)) = "J" THEN REPLACE CHR$(172)
WITH "1/4" IN zeile$ REPLACE CHR$(171)
WITH "1/2" IN zeile$
'Jetzt folgen einige ganz wichtige Zeilen, denn
wenn die GeoWorks-Import-Funktion auf ein ASCII-
Steuerzeichen stösst, wird die ganze schöne externe
Konvertierung hinfällig. Deshalb müssen die
benötigten Steuerzeichen mit einem Null-Byte ergänzt
werden, die anderen werden gegen ein Null-Byte
ausgetauscht.
REPLACE CHR$(9) WITH CHR$(9, 0) IN zeile$
REPLACE CHR$(12) WITH CHR$(12, 0) IN zeile$
REPLACE CHR$(13, 10) WITH CHR$(13, 10, 0) IN zeile$
zutauschen$=CHR$(1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20,
22,23,24,25,26,27,28,29,30,31)
zutauschen$ = zutauschen$ + konvertvonAscii$
tauschengegen$ = STRING$(27, 0) +
konvertnachGeos$ _ + STRING$(67, ersatzzeichen$)
REPLACE ANY zutauschen$ WITH tauschengegen$ IN zeile$
REPLACE "(C)" WITH CHR$(169) IN zeile$
REPLACE "(c)" WITH CHR$(169) IN zeile$
REPLACE "(R)" WITH CHRS(168) IN zeileS
REPLACE "(r)" WITH CHR$(168) IN zeile$
REPLACE "%o" WITH CHR$(228) IN zeile$
REPLACE "
Nun sind alle Konvertierungen vorgenommen worden, die Zeile kann in die neue Datei geschrieben werden und es geht weiter mit der nächsten Zeile, bis dann (Listing Teil 1) die EOF-Bedingung erfüllt ist. Dann steigt das Programm aus der Schleife aus und schliesst die Dateien. Listing Teil 7
PUT$ #2, zeile$
LOOP
CLOSE
Sie müssen nun nur noch vor dem Import nach GeoWrite die richtigen Seiten-, Absatz- und Schrift-Einstellungen wählen, bevor Sie Einlesen aus ASCII-Datei aufrufen.
Burkhard Oerttel
Kurzlink hierhin: http://geos-printarchiv.de/439 |
|||
|
Letzte Änderung am 01.11.2019 |
||||