André Minhorst, Duisburg
Trotz aller Vorteile von XML und der Möglichkeit von Access, die gängigsten Office- und Fremdformate zu importieren, ist die gute alte Textdatei immer noch nicht ausgestorben. Ganz im Gegenteil: Nichts ist schneller erstellt und nur wenige andere Formate – wenn überhaupt – lassen sich ohne Einbinden zusätzlicher Bibliotheken per VBA erzeugen. Daher erfahren Sie in diesem Beitrag alles, was Sie zum Lesen und Erzeugen von Textdateien wissen müssen.
Zum Thema Textdateien gehört unbedingt auch eine kurze Erläuterung des ASCII-Standards.
Textdateien bestehen aus Buchstaben, Zahlen, Sonderzeichen und Steuerzeichen. ASCII legt für jedes dieser Zeichen eine Ganzzahl zur digitalen Darstellung fest. Aufgrund der weltweiten Verbreitung des ASCII-Standard ist auch zu rechnen, dass eine im Textformat gespeicherte Datei überall dort gelesen werden kann, wo es auch Computer gibt.
Für die Darstellung der ASCII-Zeichen wird ein Sieben-Bit-Code benötigt, der 128 Ganzzahlen und damit Zeichen abdeckt. Vor der Einführung von ISO 8859 verwendeten viele Hersteller das achte Bit für eigene Zwecke; dann wurden die dadurch möglichen zusätzlichen 128 Zeichen für regionale Spezialitäten wie etwa für die deutschen Umlaute ä, ö und ü verwendet. Dementsprechend gibt es verschiedene Versionen dieser international gültigen Norm. Verlassen können Sie sich aber definitiv nur auf die ersten 128 Zeichen.
Neben den kleinen (ASCII-Code 97-122) und großen Buchstaben (65-90) und den Zahlen (48-57) sind für uns vor allem die Steuerzeichen interessant. Von den Steuerzeichen dürften vor allem Line Feed (10) und Carriage Return (13) sowie Horizontal Tab (9) bekannt sein.
VBA und ASCII
Unter VBA sind in Zusammenhang mit ASCII zwei Befehle interessant:
Mit ASC ermitteln Sie den ASCII-Code für ein als Parameter übergebenes Zeichen. Die folgende Anweisung gibt beispielsweise den Wert 97 im Testfenster aus:
ASC("a")
Andersherum lassen sich mit der CHR-Funktion die hinter den Zahlenwerten stehenden Zeichen ermitteln. Die Anweisung
CHR(65)
ergibt, im Testfenster abgesetzt, beispielsweise die Ausgabe A.
Es gibt mehrere Möglichkeiten für den Zugriff auf eine Textdatei. Sie können Daten lesen, den bestehenden Inhalt überschreiben oder neuen Inhalt an die Datei anhängen.
Bevor eine dieser Aktionen erfolgen kann, müssen Sie die Textdatei für den Zugriff vorbereiten. Dazu dient die Open-Anweisung. Sie erwartet mehrere Parameter, die im Wesentlichen den Dateinamen, die Zugriffsart und eine Dateinummer als Referenz für die folgenden Operationen umfassen. Der für die meisten Zwecke ausreichende Aufbau sieht folgendermaßen aus:
Open <Pfadname> For <Modus> As <Dateinummer>
Existiert die Datei
Für den Parameter Pfadname geben Sie den Namen einer existierenden oder der zu erstellenden Datei an. Es ist also keine zusätzliche Anweisung zum Anlegen der Datei erforderlich. Das gilt natürlich nicht, wenn Sie die Datei im Input-Modus öffnen – wie soll man schon aus einer neuen und leeren Datei lesen
Modus
Im Zusammenhang mit Textdateien sind die drei Modi Append, Input und Output interessant.
Public Function DateiZeichenweiseLesen() Dim intFilenumber As Integer intFilenumber = FreeFile Open "c:\test.txt" For Input As intFilenumber Do While Not EOF(intFilenumber) Debug.Print Input(1, intFilenumber) Loop Close intFilenumber End Function
Quellcode 1
Dateinummer
Die Dateinummer legen Sie einmal beim öffnen der Datei fest und verweisen bei folgenden Anweisungen auf diese Dateinummer statt auf den Dateinamen.
Da eine statische Zuweisung oft zu Fehlern führt, weil die gleiche Nummer schnell zweimal vergeben wird, verwendet man eine spezielle Funktion, um eine freie Nummer zu finden. Diese Funktion heißt Freefile und gibt die nächste nicht als Dateinummer verwendete Ganzzahl zwischen 1 und 511 aus. Wenn Sie nicht die Freefile-Funktion verwenden, müssen Sie der selbst gewählten Zahl eine Raute (#) voranstellen.
Beispiele für das öffnen von Dateien
Die folgende Anweisung öffnet eine Datei zum Lesen (mit statischer Dateinummer):
Open "c:\test.txt" For Input As #1
Wenn Sie eine dynamisch ermittelte Dateinummer verwenden und anschließend in weiteren Anweisungen auf diese zugreifen möchten, verwenden Sie folgende Befehlsfolge zum öffnen einer Datei:
Dim intFilenumber As Integer intFilenumber = FreeFile Open "c:\test.txt" For Input _ As intFilenumber
Zum Lesen von Textdateien stehen mehrere Funktionen zur Verfügung. Sie können Textdateien Zeichen für Zeichen, zeilenweise oder komplett einlesen. Welche Vorgehensweise die richtige ist, hängt von der jeweiligen Anwendung ab.
Hinweis
Um die Beispiele zum Einlesen von Textdateien nachzuvollziehen, muss natürlich erst einmal eine Textdatei vorhanden sein. Diese legen Sie ganz einfach selbst mit dem Texteditor von Windows an.
Zeichen für Zeichen
Um eine Datei Zeichen für Zeichen einzulesen, verwenden Sie die Input-Funktion mit einem entsprechenden Parameter. Die Funktion aus Quellcode 1 gibt eine per Texteditor erstellte Textdatei mit einem Zeichen je Zeile aus.
Dazu liest eine Anweisung innerhalb einer Schleife nach dem öffnen der Datei jeweils ein Zeichen der Datei ein. Die Abbruchbedingung enthält eine Funktion namens EOF. Diese Funktion überprüft, ob das Ende der Datei erreicht ist, und gibt in diesem Fall den Wert True zurück.
Public Function DateiZeilenweiseLesen() Dim intFilenumber As Integer Dim strLine As String intFilenumber = FreeFile Open "c:\test.txt" For Input As intFilenumber Do While Not EOF(intFilenumber) Line Input #intFilenumber, strLine Debug.Print strLine Loop Close intFilenumber End Function
Quellcode 2
Public Function DateiMitFeldernLesen() Dim intFilenumber As Integer Dim strLine As String intFilenumber = FreeFile Open "c:\Artikel.txt" For Input As intFilenumber Do While Not EOF(intFilenumber) Input #intFilenumber, Artikelnummer, _ Artikelname, Liefereinheit Debug.Print Artikelnummer, Artikelname, _ Liefereinheit Loop Close intFilenumber End Function
Quellcode 3
Bild 1: Textdatei mit durch Kommata getrennten Daten
Zeile für Zeile
Bei der zweiten Variante zum Einlesen einer Textdatei wird jeweils eine komplette Zeile in eine Variable eingelesen.
Quellcode 2 enthält ein Beispiel für die Verwendung der dazu erforderlichen Line Input #-Anweisung. Auch hier erfolgt das Einlesen innerhalb einer Do While-Schleife. Die Schleife enthält je einen Aufruf der Funktion Line Input #.
Die Funktion hat zwei Parameter: Die Dateinummer und eine Variable vom Datentyp String zur Speicherung des jeweiligen Zeileninhalts.
Zu beachten ist hier, dass unmittelbar hinter dem Raute-Zeichen (#) der Funktion die Dateinummer anzugeben ist – also beispielsweise #1 für eine statische Dateinummer oder #intFilenumber für eine dynamisch ermittelte Dateinummer.
Einlesen speziell formatierter Textdateien
Je nach dem Format der einzulesenden Texte werden diese nach dem Einlesen in einer separaten Funktion ausgewertet und in die gewünschte Form gebracht oder direkt im gewünschten Format eingelesen.
Ein Beispiel für Letzteres sind Dateien, in denen jede Zeile eine feste Anzahl Elemente enthält, die durch ein bestimmtes Zeichen wie beispielsweise ein Komma getrennt sind. Auf diese Art könnte man etwa den Inhalt einer Tabelle leicht in eine Textdatei schreiben, auf einem anderen Rechner wieder einlesen und anschließend direkt weiterverwenden.
Public Function KompletteDateiLesen() Dim intFilenumber As Integer Dim strText As String intFilenumber = FreeFile Open "c:\Artikel.txt" For Input As intFilenumber strText = Input(LOF(intFilenumber), intFilenumber) Debug.Print strText Close intFilenumber End Function
Quellcode 4
Bild 1 zeigt ein Beispiel für eine Textdatei mit durch Komma voneinander getrennten Daten.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo