Logo: Geos Online Print Archiv
G.O.P.A. - Geos Online Print Archiv
23.04.2024 Archiv  #  Recherche  #  Links  #  Kontakt  #  Gästebuch  #  Impressum

Index
Register
Login

Die Anzeige des Archivs erfolgt grafisch. Ändern

GeoTools - Die Textkonvertierung

Autor: Burkhard Oerttel

Die Textkonvertierung

 GeoTools, die 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.
Ausgangspunkt für die Überlegungen, ein solches Modul in die GeoTools aufzunehmen, sind einige Unzulänglichkeiten von GeoWorks beim ASCII-Import einerseits und unschöne Gewohnheiten einiger Zeitgenossen, die sich einfach nicht von der Bedienungsweise der Schreibmaschine lösen können, andererseits. Nehmen wir z.B. den folgenden, mit der Funktion Einlesen aus ASCII-Textdatei importierten Text:

  Untersuchung der Wanderungsbewegung 

 

Grösstes Handicap ist die Notwendigkeit, daß der importierte Text nur dort Zeilenschaltungen besitzen darf, wo ein Absatz beendet wird, nicht aber hinter jeder Zeile, wie sie manche Textprogramme setzen. Auch der Beispieltext stammt aus einem solchen Programm; bei Schrift mit festen Zeichenabständen würde er die Zeilen auch füllen, die Proportionalschrift läßt aber rechts reichlich Platz. Weitere Unzulänglichkeiten: Die Überschrift wurde mittels Leerschritten "zentriert", was auch nur bei Monospace-Schriften gelingt. GeoWrite erkennt außerdem einige ASCII-Sonderzeichen nicht und - was die Schweizer stört - wandelt "ß" nicht in "ss" um.

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.

Untersuchung der Wanderungsbewegung

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.
Nicht ganz so einfach ist es, zu entscheiden, welche der CR/LF-Codes in einem Text Absatzmarken sind und welche unerwünschte Zeilenschaltungen. Mit dem Eliminieren sämtlicher CR/LF-Codes würde man auch sämtliche Absatzmarken verlieren, was nicht im Sinne des Benutzers wäre.
Zum Glück gibt es ein (zumeist) untrügliches Kennzeichen: Absätze werden in herkömmlichen Textprogrammen - wie früher auf der Schreibmaschine - durch eine Leerzeile gekennzeichnet. Hier setzt das Konvertierungsmodul auf und lässt immer dann einen CR/LF-Code stehen, wenn mindestens zwei davon aufeinanderfolgen. Diese Bearbeitungsform wählen Sie, wenn Sie in der Optionen-Box die erste Option auf "J" setzen.

 

          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.
Mit dem reinen Entfernen von CR/LF-Codes ist allerdings die "Intelligenz" des Konvenierungsprogramms noch nicht erschöpft. Auch wenn keine Leerzeile folgt, braucht das noch lange keine überflüssige Zeilenschaltung zu sein. Man denke nur an Aufzählungen u.ä. Die Textkonvertierung lässt deshalb auch Zeilenschaltungen stehen, wenn darauf unmittelbar typische Zeichen für Aufzählungen folgen, also z.B. Spiegelstriche, Numerierungen (1. 2. 3. ...), Kennbuchstaben ( a) b) c) ...) sowie für Einrückungen Tab-Sprünge und auch führende Leerschritte! Diese führenden Leerschritte lassen sich wahlweise entweder in Tab-Sprünge umwandeln mit der Option "Ja" (als Hilfsmittel, wenn der Verfasser des zu importierenden Schriftstücks noch den alten Traditionen der Schreibmaschine verhaftet ist und nach dem Motto "Was schert mich die Tab-Taste, hab' ich doch die Leertaste für Einrückungen." arbeitet) oder gänzlich eliminieren für Texte all jener (meist Shareware-) Autoren, die zur Vermeidung von Rand Problemen beim Ausdruck "schöne breite" Ränder aus Leerschritten um ihre Texte setzen.
Da die auszumerzenden Leerschritte zuerst bearbeitet werden müssen (anderenfalls würde sich die "Zeilenendcode-Entfernen-Funktion" davon irritieren lassen), bearbeitet das Konvertierungsprogramm die Option Nr. 3 zuerst.

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 ""   WITH "ss" IN  zeile$
      'Das ist der Austausch von ß gegen ss, auch wenn der
      Befehl etwas komisch aussieht. Im String konvertvonAscii$
      ist das ß (ASCII codiert) schon enthalten und wird mit
      konvertnachGeos$ in den richtigen GeoWorks-Code
      umgewandelt. Der entspricht dem ASCII-Zeichen , das nun,
      weil ja auf DOS-Ebene programmiert wird in ss umzuwandeln ist.
      Alle Klarheiten beseitigt
   END IF

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

 

 

 




Dieser Artikel ist Bestandteil von:

Ausgabe 05

Neu | GeoTools Hinweis | GeoWorks Version 2.0 - 5 unbequeme Fragen ... | Fragen, Zu Verkaufen | GUG Treffen 1993, GUG Beitragskontrolle | GeoTools - Die Textkonvertierung | MS-DOS 6.0 | GUG - Treff | GEOS-ICON-EDITOR | Kopieren oder Verschieben | Markieren mit der Taste CTRL | BRIEFKOEPFE | Adressen Kleber Beispiel | DTP im Handumdrehen | Schriften für GeoWorks - Font-o-Theke | Terminer-Formular mit Geoworks | Den Computerspeicher Optimal nutzen!!


Kurzlink hierhin: http://geos-printarchiv.de/439


Letzte Änderung am 01.11.2019