Home > Artikel > Ausgabe 2/2019 > Das FileSystemObject: Textstream

Das FileSystemObject: Textstream

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).

Die VBA-eigenen Befehle wie Open, Write, Input, Close und so weiter erlauben das Erstellen, Schreiben und Lesen von Textdateien. Wenn es etwas komfortabler sein darf, gibt es jedoch noch andere Möglichkeiten. Eine davon ist die Klasse FileSystemObject, die Sie in der Bibliothek Microsoft Scripting Runtime finden. In den Artikeln Das FileSystemObject: Verzeichnisse und Das FileSystemObject: Dateien haben wir die Grundlagen zu dieser Bibliothek und zum Umgang mit Laufwerken, Verzeichnissen und Dateien erläutert. Dieser Artikel zeigt, welche Möglichkeiten diese Bibliothek im Hinblick auf den Umgang mit Textdateien bietet.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1902_FileSystemObject_Textstream.accdb.

Die TextStream-Klasse

Beim Aufruf der Methode CreateTextFile der FileSystemObject-Klasse und der Folder-Klasse werden Objekte des Typs TextStream zurückgeliefert.

Diese weisen die folgenden Eigenschaften auf:

  • AtEndOfLine: Gibt an, ob sich der Zeiger am Ende der aktuellen Zeile befindet.
  • AtEndOfStream: Gibt an, ob sich der Zeiger am Ende des Streams befindet.
  • Close: Schließt einen offenen Textstream.
  • Column: Gibt die aktuelle Spalte des Zeigers aus.
  • Line: Gibt die Nummer der aktuellen Zeile des Zeigers aus.
  • Read: Liest die mit dem Parameter angegebene Menge an Zeichen.
  • ReadAll: Liest den kompletten Inhalt des TextStream-Objekts.
  • ReadLine: Liest die jeweils folgende Zeile des TextStream-Objekts.
  • Skip: Verschiebt den Zeiger um die angegebene Anzahl Zeichen in Richtung Ende des Streams.
  • SkipLine: Verschiebt den Zeiger auf den Anfang der nächsten Zeile.
  • Write: Fügt den Inhalt des Parameters hinter dem letzten vorhandenen Zeichen in einem Textstream-Objekt ein.
  • WriteBlankLines: Fügt hinter dem letzten Zeichen des TextStream-Objekts leere Zeilen entsprechend der im Parameter angegebenen Anzahl ein.
  • WriteLine: Fügt den als Parameter angegebenen Text hinter dem letzten Zeichen des TextStream-Objekts ein und hängt ein Zeilenumbruchszeichen hinten an.

Erstellen einer Textdatei und Füllen mit Text aus einer Variablen

Wenn Sie einfach nur den Inhalt einer String-Variablen in eine neue Textdatei schreiben wollen, gehen Sie wie folgt vor:

Dim strDatei As String

Dim strPfad As String

Dim strText As String

Dim objTextstream As TextStream

strDatei = Replace(FSO.GetTempName, ".tmp", ".txt")

strPfad = FSO.BuildPath(CurrentProject.Path, strDatei)

strText = "Dies ist ein Beispieltext." & vbCrLf

strText = strText & "Und noch eine Zeile." & vbCrLf

strText = strText & "Und die letzte Zeile."

Set objTextstream = FSO.CreateTextFile(strPfad)

With objTextstream

.Write strText

End With

objTextstream.Close

Hier ermitteln wir einen temporären Dateinamen, bei dem wir die Dateiendung .tmp durch .txt ersetzen. Dann fügen wir diese über die Funktion BuildPath mit dem Verzeichnis der aktuellen Datenbank zu einem Pfad zusammen. Außerdem fügen wir in der Variablen strText einen mehrzeiligen Text zusammen, den wir dann zur Datei hinzufügen wollen.

Die Textdatei erstellen wir mit der CreateTextFile-Methode des FileSystemObject-Objekts, der wir als Parameter den Pfad aus strPfad übergeben.

Dann nutzen wir die Write-Methode des mit der Variablen objTextstream erstellten TextStream-Objekts, um den Inhalt der Variablen strText einzufügen.

Schließlich schließen wir die Datei mit der Close-Methode. Das Ergebnis ist eine Textdatei mit dem Text aus strText (siehe Bild 1).

Eine erste Textdatei mit Inhalt

Bild 1: Eine erste Textdatei mit Inhalt

TextStream-Objekt für Folder erzeugen

Nicht nur das FileSystemObject-Objekt, sondern auch das Folder-Objekt bietet die Methode CreateTextFile an.

Dieser brauchen Sie dann nur noch den Dateinamen zu übergeben, da das Zielverzeichnis ja schon im Folder-Objekt steckt:

Dim strDatei As String

Dim objFolder As Folder

Dim objTextstream As TextStream

strDatei = Replace(FSO.GetTempName, ".tmp", ".txt")

Set objFolder = FSO.GetFolder(CurrentProject.Path)

Set objTextstream = objFolder.CreateTextFile(strDatei)

objTextstream.Close

Text in TextStream-Objekt schreiben

Was geschieht, wenn wir die drei Zeilen in einzelnen Write-Anweisungen zum TextStream-Objekt hinzufügen?

With objTextstream

.Write "Dies ist ein Beispieltext."

.Write "Und noch eine Zeile."

.Write "Und die letzte Zeile."

End With

Dann wird der Text einfach ohne Zeilenumbruch aneinander gehängt:

Dies ist ein Beispieltext.Und noch eine Zeile.Und die letzte Zeile.

Wenn der Text jeweils in einer neuen Zeile geschrieben werden soll, verwenden Sie die WriteLine-Methode:

With objTextstream

.WriteLine "Dies ist ein Beispieltext."

.WriteLine "Und noch eine Zeile."

.WriteLine "Und die letzte Zeile."

End With

Dies hängt an den Text jeweils noch einen Zeilenumbruch an. Genau genommen könnten wir uns den bei der letzten Zeile sparen:

With objTextstream

.WriteLine "Dies ist ein Beispieltext."

.WriteLine "Und noch eine Zeile."

.Write "Und die letzte Zeile."

End With

Leere Zeilen einfügen

Es gibt noch eine letzte Anweisung, um Text einzufügen. Genau genommen fügt diese Anweisung keinen Text ein, sondern nur Zeilenumbruchszeichen. Sie heißt WriteBankLines und erwartet die Anzahl der einzufügenden leeren Zeilen als Parameter:

With objTextstream

.WriteLine "Dies ist ein Beispieltext."

.WriteBlankLines 3

.WriteLine "Und noch eine Zeile."

.Write "Und die letzte Zeile."

End With

Unterschied Unicode/ASCII

In den abgewandelten Varianten der obigen Funktion erstellen wir die Textdateien einmal als Unicode-Version und einmal als ASCII-Version:

Public Sub TextdateiUnicode()

...

strDatei = "Unicode.txt"

...

Set objTextstream = FSO.CreateTextFile(strPfad, , True)

...

Debug.Print FSO.GetFile(strPfad).Size

End Sub

Public Sub TextdateiASCII()

...

strDatei = "ASCII.txt"

...

Set objTextstream = FSO.CreateTextFile(strPfad, , False)

...

Debug.Print FSO.GetFile(strPfad).Size

End Sub

Der offensichtliche Unterschied zwischen den entstandenen Dateien ist die Dateigröße. Die ASCII-Datei ASCII.txt hat eine Größe von 71 Zeichen, die Unicode-Datei Unicode.txt eine Größe von 144 Zeichen – diese Zahlen lassen wir uns mit der letzten Zeile der beiden Prozeduren ausgeben.

Die 71 Bytes der ASCII-Datei ergeben sich aus den 67 regulären Zeichen und den Codes für die Zeilenumbrüche, die jeweils zwei Zeichen lang sind (vbCrLf entspricht Chr(13) & Chr(10)). Unter ASCII gibt es nur 256 Codes für verschiedene Zeichen.

Dies sollte unter Unicode nur 142 Bytes entsprechen, da unter Unicode für jedes Zeichen zwei Bytes Speicherplatz benötigt werden – damit sind also statt 256 Zeichen satte 65536 Zeichen kodierbar.

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!