Eine Textdatei in CSV-Formatierung konvertieren

Um elektronisch vorliegende Daten in eine Datenbank wie Filemaker zu importieren, müssen diese irgendwie strukturiert sein, z.B. als "kommaseparierte" Textdatei (CSV-Datei). Hier wird gezeigt, wie das mit einem Text-Editor und der Suchen-und-Ersetzen-Funktion (mit Regular Expressions) funktioniert.

Wir benutzen im Kurs als Texteditor "BBEdit", der auf den Macs installiert ist. Alternative Software findet sich in dieser Liste.

Wie Reguläre Ausdrücke genau funktionieren, kann hier nachgelesen werden. Um das Beispiel nachzuvollziehen ist das aber nicht nötig, die Formeln werden auch hier erklärt.

Es empfiehlt sich die Suchmuster gleich parallel zur Lektüre Schritt für Schritt selber auszuprobieren!

Als Ausgangsdatei verwenden wir folgende Datei:

artikel.txt

Die Datei muss in einem Texteditor, der mit regulären Ausdrücken arbeiten kann, geöffnet werden. Wir arbeiten hier mit BBEdit. Beim Text handelt es sich um vier Einträge eines Weblogs.

Über den Befehl "Search" -> "Find..." öffnet sich das Dialogfenster, mit dem wir suchen können. Ins obere Eingabefenster kommt der Suchbegriff, ins untere den Ausdruck, mit dem wir das Gefundene (oder Teile davon) ersetzen wollen. Wenn wir mit regulären Ausdrücken suchen wollen, muss das Häkchen bei "Use Grep" gesetzt sein.

Schauen wir uns zuerst die Struktur des Textes an:



Die einzelnen Einträge sind immer durch eine Datumszeile voneinander getrennt (rot) und schliessen mit einer Fusszeile (gelb) ab. Nach beiden Zeilen können wir mit regulären Ausdrücken suchen, da sie ein standardisiertes Format haben.

Die Datumszeile, z.B.
4. Januar 2006
findet man mit folgendem Suchmuster:
.+, \d+\. .+ \d\d\d\d
Natürlichsprachlich formuliert bedeutet diese Formel: Der Suchausdruck beginnt mit einem beliebigen Zeichen (.), das mindestens einmal vorkommt (+), gefolgt von einem Komma und einem Leerschlag, dann folgt eine Zahl (\d), die mindestens aus einer Ziffer besteht (+), gefolgt von einem Punkt (\.) und einem Leerzeichen. Es folgt dann ein mindestens ein beliebiges Zeichen (.+), ein Leerzeichen und dann vier Ziffern hintereinander (\d\d\d\d).

Der Wochentag interessiert uns nicht. Wir merken uns deshalb nur den Rest und setzen das, was wir uns merken wollen, in Klammern:
.+, (\d+\. .+ \d\d\d\d)
Die Zeile nach dem Datum muss der Titel des Eintrags sein.
Sonntag, 1. Januar 2006
Schlüsselkundenbetreuer: Die Semantik von Anglizismen
Vielleicht ein Beispiel...
Wir nehmen ihn mit ins Suchmuster und merken ihn uns auch:
.+, (\d+\. .+ \d\d\d\d)\r(.+)\r
Die beiden \r bedeuten eine Zeilenschaltung. Der Titel (in Klammern) muss wieder aus mindestens einem beliebigen Zeichen bestehen (.+).

Danach folgt Text unterschiedlichster Länge, ev. auch mit Absätzen. Wir wissen aber, dass der Text fertig ist, wenn die Zeile "Geschrieben von..." beginnt. Also nehmen wir das als Ende des Textteiles und integrieren den Text wiederum in die Suche:
.+, (\d+\. .+ \d\d\d\d)\r(.+)\r([\w\W]+?)\rGeschrieben von
Um die ganze Bandbreite von Textzeichen (also Buchstaben, aber auch Leerzeichen, Zeilenschaltungen, Satzzeichen etc.) zu erfassen, benutzen wir die beiden Zeichen \w und \W, wobei \w alle Buchstaben und Zahlen meint, \W gerade alle Nicht-Buchstaben. Wir fassen die beiden Symbole zu einer Klasse in eckige Klammern zusammen und sagen, dass diese Zeichen mindestens einmal (+) vorkommen sollen. Da das Suchmuster so aber zu gefrässig wäre und auch das "Geschrieben von..." mitnehmen würde, setzen wir noch ein Fragezeichen hinter das +. Die Kombination +? bedeutet immer: Das Zeichen davor soll mindestens einmal oder mehrfach vorkommen, aber nicht mehr als nötig.

Den Text des Eintrages [\w\W]+? merken wir uns wieder und setzen ihn in Klammern. Danach folgt eine Zeilenschaltung \r und anschliessend "Geschrieben von".

Von dieser Fusszeile interessieren uns noch der Autor und die Zeit, den Rest beachten wir nicht mehr:
Geschrieben von nb um 21:17 | Kommentare (0) | Trackbacks (0)
.+, (\d+\. .+ \d\d\d\d)\r(.+)\r([\w\W]+?)\rGeschrieben von (.+) um (\d\d:\d\d).*
Zwischen "von" und "um" kommen also irgendwelche Zeichen vor (Autor), die wir uns merken. Nach "um" folgt die Zeit, die besteht aus Ziffern und einem Doppelpunkt, die wir uns ebenfalls merken. Danach folgen ev. weitere Zeichen, die uns nicht mehr interessieren.

Damit finden wir jeweils einen Eintrag. Jetzt können wir aus den geklammerten Teilen einen neuen Text zusammensetzen, mit dem wir das Gefundene ersetzen. Mit \1, \2, \3 etc. können wir auf die geklammerten Zeichen zugreifen. Da wir eine kommaseparierte Datei erstellen wollen, setzen wir jeweils dazwischen Kommata und setzen die Inhalte in Anführungszeichen:
"\1","\2","\3","\4","\5"
Die Datei ist fertig – wir speichern sie unter neuem Namen mit der Endung ".csv" und können sie mit Filemaker einlesen.

Die CSV-Datei sollte so aussehen: artikel.csv