Home > Artikel > Ausgabe 6/2012 > Textdateien schreiben und lesen

Textdateien schreiben und lesen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

VBA bietet einige einfache Methoden, um Textdateien zu erstellen, diese mit Texten zu füllen und auch die enthaltenen Texte zu lesen. Dieser Artikel stellt diese Methoden vor und erläutert, wie Sie eine Datei komplett oder zeilenweise lesen, wie Sie neue Dateien erstellen und mit Texten füllen oder Texte zu bestehenden Dateien hinzufügen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1206_Textdateien.mdb</b>.

Wozu Textdateien verwenden?

Auch wenn Sie mit Access auf strukturierte Dokumenttypen wie XML-Dokumente oder die Office-Dateitypen zugreifen können, hat die gute alte Textdatei dennoch ihre Berechtigung. Immerhin gibt es noch zahlreiche Anwendungen, die Ihre Daten beispielsweise zeilenweise im CSV-Format ausgeben – und dies lässt sich prima mit den Methoden zum Einlesen von Textdateien auswerten. Aus dem gleichen Grund ist auch das Erstellen und Beschreiben von Textdateien noch längst nicht aus der Mode gekommen.

Inhalt von Textdateien

Textdateien speichern in der Regel Buchstaben, Zahlen, Sonderzeichen und Steuerzeichen. ASCII legt für jedes dieser Zeichen eine Ganzzahl zur digitalen Darstellung fest. Da der ASCII-Standard weltweit verbreitet ist, kann man auch damit rechnen, dass eine im Textformat gespeicherte Datei überall dort gelesen werden kann, wo es auch Computer gibt.

Ein ASCII-Zeichen benötigt ein Byte Speicherplatz in der Textdatei. Mit einem Byte lassen sich Zahlen von 0 bis 255 darstellen. Die ersten 128 decken einen Standardzeichensatz ab, die übrigen stehen für Sonderzeichen und länderspezifische Zeichen wie etwa die deutschen Umlaute.

Kleine Buchstaben belegen die ASCII-Codes 97-122, große Buchstaben die Codes 65-90. Die Zahlen finden sich in den Codes 48-57.

Textdateien mit und ohne Zeilenumbruch

Es gibt zwei Möglichkeiten, Daten in einer Textdatei zu speichern: in Zeilen, die durch spezielle Steuerzeichen voneinander getrennt werden und in Zeilen fester Zeichenlänge. Im ersten Fall geben die beiden Zeichen <b>Line Feed </b>(<b>10</b>) und <b>Carriage Return </b>(<b>13</b>) den Zeilenumbruch an, im zweiten Fall wird jede Zeile bis zur angegebenen Zeichenanzahl aufgefüllt. Dieser Artikel stellt die Methoden zur ersten Variante vor.

Datei vorbereiten

Für die unterschiedlichen Zugriffsarten auf eine Textdatei gibt es verschiedene Parameter. Wie behandeln die folgenden Möglichkeiten:

  • Schreiben in eine neue Datei
  • Schreiben in eine vorhandene Datei
  • Lesen aus einer Datei

Die Vorbereitung der Datei, also das Öffnen oder Anlegen, übernimmt in allen Fällen die <b>Open</b>-Anweisung. Die grundlegende Syntax sieht wie folgt aus:

Open <Pfadname> For <Modus> As <Dateinummer>

Angeben des Dateinamens

Sie können entweder den kompletten Dateinamen inklusive Laufwerk und Pfad angeben oder nur einen Dateinamen. Der erste Fall ist klar, im zweiten Fall ergänzt Access die Datei um das aktuelle, mit der Funktion <b>CurDir </b>auszulesende und mit <b>ChDir </b>zu setzende Verzeichnis (siehe auch Artikel <b>Dateibefehle</b>).

Je nach Öffnungsmodus muss die Datei bereits vorhanden sein (<b>Output</b>), anderenfalls wird diese gegebenenfalls beim Öffnen erstellt (<b>Input</b>, <b>Append</b>).

Öffnungsmodus

In Zusammenhang mit Textdateien gibt es drei verschiedene Modi zum Öffnen einer Datei:

  • <b>Append</b>: Öffnet oder erstellt eine Datei zum Anhängen weiterer Inhalte
  • <b>Input</b>: Öffnet oder erstellt eine Datei und fügt Inhalte ein, vorhandene Inhalte werden gelöscht
  • <b>Output</b>: Öffnet eine bestehende Datei und bereitet diese zum Lesen der Inhalte vor.

Output und Input – wie soll man sich das merken? Ganz einfach: Gehen Sie immer von der VBA-Prozedur aus, die auf die Datei zugreift.

Liest diese die Daten aus der Textdatei ein, verwenden Sie den <b>Input</b>-Modus (Daten fließen zur Prozedur), sonst den <b>Output</b>-Modus (Daten fließen zur Datei).

Dateinummer

Üblicherweise gibt man als Dateinummer einfach den Wert <b>#1 </b>an. Dies kann jedoch in die Hose gehen, wenn die gleiche Access-Instanz an anderer Stelle bereits eine Datei mit dieser Nummer geöffnet hat.

Wenn es verschiedene Prozeduren innerhalb einer Anwendung gibt, die Dateien öffnen und bei denen es vorkommen kann, dass die eine Datei noch offen ist, während eine andere geöffnet werden soll, können Sie für jeden Ort innerhalb der Datenbank eine andere Dateinummer angeben, also <b>#1</b>, <b>#2 </b>und so weiter.

Noch einfacher geht es, wenn Sie die Funktion FreeFile nutzen, um sich eine aktuell freie Dateinummer geben zu lassen. Normalerweise gibt <b>FreeFile</b> die kleinste verfügbare Dateinummer zurück, was sich einfach im Direktfenster prüfen lässt:

Debug.Print FreeFile

1

Ob diese Funktion funktioniert, können Sie prüfen, indem Sie zuvor eine Datei mit der Nummer <b>1 </b>öffnen und dann nochmals <b>FreeFile </b>im Direktfenster aufrufen (siehe Bild 1).

Aufruf von FreeFile während bereits eine Datei geöffnet ist

Bild 1: Aufruf von FreeFile während bereits eine Datei geöffnet ist

Wozu benötigen Sie nun eine solche Dateinummer? Nun: Sie vergeben diese beim Öffnen oder Anlegen der Datei und müssen diese auch beiden folgenden Operationen angeben, damit VBA weiß, aus welcher Datei Daten gelesen oder in welche Datei Daten geschrieben werden sollen.

Wir schauen uns an einem einfachen Beispiel an, wie eine feste Dateinummer im Vergleich zu einer per <b>FreeFile </b>ermittelten Dateinummer eingesetzt wird.

Die folgende kleine Prozedur öffnet eine Datei zum Beschreiben und trägt eine Zeile mit Text ein. Dabei wird in jeder Anweisung die #1 als Dateinummer für den Zugriff verwendet:

Public Sub TextdateiErstellenUndSchreiben()

     Open CurrentProject.Path & "\test.txt" _

         For Output As #1

     Print #1, "Hallo"

     Close #1

End Sub

Mit der <b>FreeFile</b>-Funktion benötigen Sie eine Variable, welche die Dateinummer speichert, um diese für alle Zugriffe bereitzustellen – hier <b>intFile </b>genannt. Dieser Variablen weisen Sie den Wert der Funktion <b>FreeFile </b>zu, also beispielsweise die Zahl <b>2</b>. In den folgenden drei Anweisungen wird statt <b>1 </b>der Variablenname <b>intFile </b>angegeben:

Public Sub TextdateiErstellenUndSchreiben_FreeFile()

     Dim intFile As Integer

     intFile = FreeFile

     Open CurrentProject.Path & "\test.txt" For _

         Output As #intFile

     Print #intFile, "Hallo"

     Close #intFile

End Sub

Sie können an allen drei Stellen das Raute-Zeichen beibehalten, aber Sie müssen es mit der <b>Print</b>-Anweisung verwenden – anderenfalls löst dies einen Fehler aus.

Damit haben Sie gleichzeitig schon eine einfache Variante zum Schreiben einer Zeile Text in eine Textdatei kennengelernt.

Lesen einer kompletten Textdatei

Wenn Sie den kompletten Inhalt einer Textdatei in eine Variable einlesen möchten, verwenden Sie eine Prozedur wie die folgende:

Public Sub TextdateiLesen()

     Dim strText As String

     Dim lngAnzahlZeichen As Long

     Open CurrentProject.Path & "\test.txt" _

         For Input As #1

     lngAnzahlZeichen = LOF(1)

     strText = Input(lngAnzahlZeichen, #1)

     Debug.Print strText

     Close #1

End Sub

Die Prozedur öffnet zunächst die Datei für den lesenden Zugriff. Die Datei muss unbedingt vorhanden sein, sonst löst die <b>Open</b>-Anweisung einen Fehler aus.

Nach dem Öffnen der Datei ermitteln Sie mit der Funktion <b>LOF </b>die Anzahl der enthaltenen Zeichen. Der Parameterwert <b>1 </b>entspricht der verwendeten Dateinummer. Sollten Sie also mit einer mit <b>FreeFile </b>ermittelten Dateinummer arbeiten, ersetzen Sie <b>1 </b>durch die Variable mit der Dateinummer.

Danach liest die Input-Methode aus der mit <b>#1 </b>referenzierten Datei die ersten n Zeichen ein, wobei n dem Inhalt der Variablen <b>lngAnzahlZeichen </b>entspricht – in diesem Fall der kompletten Datei. Die <b>Debug.Print</b>-Anweisung gibt die ermittelte Zeichenkette mangels echtem Verwendungszweck im Direktfenster aus, bevor die <b>Close</b>-Anweisung die Datei wieder schließt.

Text an eine Textdatei anhängen

Die folgende Prozedur öffnet eine Textdatei im <b>Append</b>-Modus. Das bedeutet, dass die Datei entweder neu erstellt wird (sofern diese noch nicht existiert) oder dass eine bestehende Datei geöffnet wird. Dieser Datei hängt die Prozedur eine neue Zeile mit dem angegebenen Inhalt an:

Public Sub TextdateiTextAnhaengen()

     Open CurrentProject.Path & "\Append.txt" _

         For Append As #1

     Print #1, "Hallo"

     Close #1

End Sub

Wenn Sie diese Prozedur mehrfach aufrufen, finden Sie die Zeile mit dem Text <b>Hallo </b>entsprechend der Anzahl der Aufrufe in der Datei vor.

Datei zeilenweise einlesen

Sie können eine Datei auch zeilenweise einlesen. Dazu öffnen Sie die Datei im <b>Input</b>-Modus und prüfen dann mit der <b>EOF</b>-Funktion, ob das Ende der Datei erreicht ist. Die <b>EOF</b>-Funktion erwartet wiederum die Dateinummer als Parameter. Eine <b>Do While</b>-Schleife wird solange durchlaufen, bis <b>EOF(1) </b>den Wert <b>False </b>annimmt.

Innerhalb der Schleife verwenden Sie die <b>Line Input</b>-Anweisung mit der Dateinummer und einer String-Variablen als Parameter. Die String-Variable, hier <b>strLine</b>, nimmt dabei den Inhalt der aktuell eingelesenen Zeile entgegen. Nach dem Einlesen wird ein Zeiger auf die nächste Zeile verschoben – solange, bis der Zeiger sich hinter der letzten Zeile befindet und <b>EOF(1) </b>den Wert <b>False </b>liefert:

Public Function DateiZeilenweiseLesen()

     Dim strLine As String

     Open CurrentProject.Path & "\Append.txt" _

         For Input As #1

     Do While Not EOF(1)

         Line Input #1, strLine

         Debug.Print strLine

     Loop

     Close 1

End Function

Wenn Sie beispielsweise nur auf die erste Zeile zugreifen möchten, können Sie dies noch einfacher erledigen:

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!