Posts tagged: Textdatei

Abfrage oder Tabelle ‚Zeichengetrennt‘ in Textdatei speichern

By , 13. Februar 2014

Die landläufige Methode eine Abfrage oder eine Tabelle als Txt-Datei zu speichern ist die Docmd.OutputTo() Methode.
Informationen dazu findet ihr hier: http://msdn.microsoft.com/en-us/library/office/…

Um aber Zeichengetrennte Textdateien zu erstellen, d.h. jede Zeile ein Datensatz, jedes Feld in der Zeile durch einen Separator getrennt, muss man die Methode Docmd.TransferText() incl. Exportspezifikation erstellen. http://msdn.microsoft.com/en-us/library/office/… Das wäre sicherlich der einfachste Weg.

Falls aber die Exportspezifikation aber nicht mehr genügt, kann man mittels Output-Stream eine Textdatei zu erstellen, eine Abfrage oder Tabelle in ein Recordset packen und zeilenweise durchlaufen und in die Textdatei zu schreiben. Und mit den Worten von Jean Pütz sag ich: „ich hab da mal was vorbereitet“:

Sub Table2Textfile(ByVal Outputfile As String, ByVal TableName As String, _
                   Optional Separator As String = ";", _
                   Optional titlebar As Boolean = False)
    
    Dim rs As DAO.Recordset
    Dim strTableRow As String
    Dim filenum As Long
    Dim i As Long
    filenum = FreeFile

    Set rs = CurrentDb.OpenRecordset(TableName)
    Open Outputfile For Output As #filenum

    'Spaltenköpfe
    If titlebar Then
        For i = 0 To rs.Fields.Count - 1
            strTableRow = strTableRow & rs(i).Name & Separator
        Next i
        strTableRow = Left(strTableRow, Len(strTableRow) - Len(Separator))
        Write #filenum, strTableRow
        strTableRow = vbNullString
    End If

    Do While Not rs.EOF
        For i = 0 To rs.Fields.Count - 1
            strTableRow = strTableRow & rs(i) & Separator
        Next i
        strTableRow = Left(strTableRow, Len(strTableRow) - Len(Separator))
        Write #filenum, strTableRow
        strTableRow = vbNullString
        rs.MoveNext
    Loop
    Close #filenum
    rs.Close
    Set rs = Nothing
End Sub

Dies ist eine universelle Prozedur mit dem man Abfragen bzw. Tabellen schnell in eine separierte Liste bringen kann.
In einer Schleife über alle Recordset-Felder wird der String zusammengestellt, welcher in die Textdatei gespeichert wird.
Ebenso die Spaltenköpfe welche mit rs(Zeilennummer).Name auszulesen sind.

Die Prozedur welche obige Prozedur aufruft sieht dann z.B. so aus:

Sub Tester()
    Table2Textfile "c:\users\Public\test4711.txt", "qryTeilnehmer", ";", True
End Sub

Anstatt eines Separators als String kann man natürlich auch VBA-Konstanten verwenden, z.B. vbTab bietet sich hier an, Verwendung ohne Anfürungszeichen!

Ein Wermutstropfen bleibt aber übrig. In der erstellten Textdatei sind die einzelnen Textzeilen in Anführungszeichen. D.h. vor dem Weiterverarbeiten müsste man eventuell mittels FileSystemObject ran gehen und die einzelnen Zeilen bearbeiten – oder falls per VBA die Weiterverarbeitung stattfindet kann man die Bereinigung auch im VBA-Code machen.

Bis dahin
© 2014 Andreas Vogt

Datenimport aus Textdatei

By , 3. November 2010

Analog zum Artikel Regelmäßiger Datenimport realisieren wo es um den Import von Daten aus Excel ging, zeige ich in diesem Artikel auf wie man aus einer Textdatei importiert. Langweilig, kennen wir schon … mögen Sie jetzt denken. Aber lesen Sie weiter, es wird spannender als Sie denken.

Die Situation ist die gleiche wie im ersten Artikel. Sie haben ein Produktiv-Backend das 7×24 Stunden im Einsatz ist. Das bedeutet dass Sie nur bereinigte Daten in das Arbeitsbackend übertragen können. Der Lösungsweg ist der gleiche wie zuvor, der Import geschieht über eine temporäre Datenbank die zum Zwecke des Imports und der Bearbeitung der Daten per Code erstellt danach gelöscht wird.

Details zum Erstellen der temporären Datenbank und Tabelle lesen Sie bitte im ersten Artikel. Der Vereinfachung halber füge ich hier nur die Prozedur ein die Datenbank und Tabelle erstellt.

Function CreateNewDB(dbNam As String, TabName As String) As Database
    Dim wrkDefault As DAO.Workspace
    Dim dbNeu As DAO.Database

    ' Standardarbeitsbereich bestimmen.
    Set wrkDefault = DBEngine.Workspaces(0)

    'wenn Datenbank bereits vorhanden, dann löschen
    If Dir(CurrentProject.Path & "\" & dbNam & ".mdb") <> "" Then
        Kill CurrentProject.Path & "\" & dbNam & ".mdb"
    End If

    'neue Datenbank erstellen
    Set dbNew = wrkDefault.CreateDatabase(CurrentProject.Path & "\" & _
                                          dbNam & ".mdb", dbLangGeneral, dbEncrypt Or dbVersion40)

    'Tabelle erstellen
    dbNew.Execute "CREATE TABLE " & TabNam & " (" & Fields & ")"

    'Rückgabewert zuweisen
    Set CreateNewDB = dbNeu
End Function

Der nächste Schritt ist der Import aus der Textdatei. In meinem Beispiel verwendete ich eine Spaltenorientierte Textdatei mit gleich langen Spalten. Es geht aber auch mit anderen Typen wie z.B. mit einem Separator etc. Der einfachste Weg ist eine Importspezifikation zu erstellen. Wer das nicht kennt hier eine Schnellanleitung dazu:

  • Über Datei/Externe Daten/Importieren Dateityp Textfiles auswählen und die entsprechende Textdatei auswählen.
  • Ein Klick auf Importieren öffnet einen Assistenten zur Zuordnung der Spalten und der Spalteneigenschaften.
  • Man wählt einen der beiden Modis aus, also Trennzeichen oder feste Breite und klickt auf „Weiter“.
  • Danach dem Assistenten folgen. Die Eingaben sollten selbsterklärend sein.
  • Zum Schluss bevor man „Fertig stellen“ klickt die Schaltfläche „Weitere“ anklicken.
  • Ein weiteres Fenster öffnet sich wo man entsprechende Auswahlen treffen sollte.
  • Zum Schluss auf „Speichern unter“ klicken, einen Spezifikationsnamen angeben und 2x OK klicken.
  • Jetzt sind Sie wieder im ersten Fenster wo Sie den Assistenten mit „Fertig stellen“ beenden.

Read more »

OfficeFolders theme by Themocracy