Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

CSVs aus MDBs leicht gemacht

Geschrieben von: Christian Holm
Kategorie: Datenbank

This printed page brought to you by AlphaSierraPapa

CSV (Comma Separated Value) Dateien bieten eine einfache Schnittstelle zwischen unterschiedlichen Datenbanksystem, um Daten untereinander auszutauschen. Da nicht jeder RDB-Systeme wie Access oder MS SQL Server verwendet, kann man mit CSV "Textdatenbanken" die enthaltenen Daten auf andere Systeme transportieren. Dies ist möglich, da CSV ein häufig akzeptierter Standard ist. Es gibt viele Lösungsmöglichkeiten um z.B. aus MS Access Datenbanken CSV kompatible Dateien zu erstellen. Dieser Artikel zeigt eine davon in VBScript, welche ganze ohne Access auskommt.

In CSV Dateien werden die einzelnen Spalteninhalte einer Datenreihe durch Beistriche getrennt. Zwar gehen bei einem solchen Konvertierungsvorgang ins CSV Format alle Beziehungen (Relationships) zu den einzelnen Tabellen verloren, man kann aber dennoch die Daten selbst auf ein anderes DB-System transportieren. Dies ist vor allem dann von Interesse, wenn es auf dem Zielsystem keine passende Konvertierungsmöglichkeit gibt.

Der heutige Artikel zeigt ein Beispiel, das eine Access Datenbank in das CSV Format konvertiert. Natürlich bietet Access selbst eine Konvertierungsoption in dieses Format an, aber wie schon erwähnt, soll diese Aufgabe ohne installiertem Access gelöst werden.

Eine der einfachsten Lösungsansätze ist die Verwendung von VBScript. Um den Sourcecode dieses Artikels leichter wiederverwendbar zu machen und auch modularer zu strukturieren, ist die Konvertierungsfunktion in eine Klasse eingebettet. Da dies nicht wirklich einen Mehraufwand bedeutet, ist diese Argumentation haltbar. Beginnen wir also mit der MDB2CSV VBScript Klasse, welche in der Datei MDB2CSVClass.asp zu finden ist:

Class MDB2CSV
   
  Public UseTextQualifier
   
  Public Sub ConvertToCSV(ByVal strConn, ByVal strSQL, ByVal strOutputFilePath)
   
    Const ForWriting = 2
    Dim strOutput
    
    Set objConn = Server.CreateObject("ADODB.Connection")
    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
    
    objConn.Open strConn

    Set objRS = objConn.Execute(strSQL)

Mit dem Class Statement erstellen wir eine neue Klasse namens MDB2CSV. Die Klasse besitzt eine Property (Eigenschaft) UseTextQualifier, mit der man angeben kann, ob die Inhalte der Datenspalten von doppelten Anführungszeichen (") begrenzt werden sollen. Diese Option dient der Erleichterung zum Erkennen einer Datenspalte, für den gegebenen Fall, daß diese selbst Beistriche oder ähnliche Zeichen enthält, die als Delimiter mißinterpretiert werden könnten.

Die Klasse enthält wegen der einfachen Aufgabe nur eine Methode (Sub-Prozedur ) ConvertToCSV, die die Konvertierungsfunktionalität zu CSV Dateien enthält. Dieser Methode müssen drei Parameter strConn, strSQL und strOutputFilePath übergeben werden.

Der strConn Parameter enthält den Connectionstring. In diesem Fall in einer für eine Access Datenbank kompatiblen Form. Dieser könnte z.B. so aussehen:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("mdb2csv.mdb")

mdb2csv.mdb bezieht sich dabei auf den Dateinamen der in diesem Beispiel verwendeten Datenbank und ist daher für jede Access Datenbank anzupassen. Der strSQL Parameter gibt das SQL Statement an, das verwendet werden soll, um die CSV Datei mit Daten zu füllen.

Der dritte und letzte Parameter strOutputFilePath gibt den vollständigen physikalischen Pfad der CSV-Datei an, welche schließlich die Daten im CSV-Format beinhalten soll. Die ForWriting Konstante enthält den numerischen Wert für das Argument, das die Art des IO-Modes der OpenTextFile Methode angibt. Diese Methode des FileSystemObjects werden wir später benötigen um die CSV-Datei zu erstellen. ForWriting schränkt in diesem Fall die Benutzung der Datei für Schreibzwecke ein.

Die strOutput Variable beinhaltet das Ergebnis der SQL Abfrage. Dieses wird später in die zu erstellende CSV-Datei geschrieben. Weiters wird noch in diesem Sourcecodeabschnitt - auf übliche Weise - eine Verbindung zu der Datenbank erstellt und eine Abfrage gemäß des übergebenen strSQL Parameters durchgeführt.

While Not objRS.EOF
    For FieldIndex = 0 To objRS.Fields.Count - 1
        If (UseTextQualifier) Then 
            strOutput = strOutput & """" & objRS(FieldIndex) & """"
        Else
            strOutput = strOutput & objRS(FieldIndex)
        End If
     
        If (FieldIndex <> objRS.Fields.Count - 1) Then
            strOutput = strOutput & ","
        End If
    Next
    strOutput = strOutput & vbCrLf
    objRS.MoveNext
Wend
    
objRS.Close
objConn.Close
Set objRS = Nothing
Set objConn = Nothing

Je nach Angabe der UseTextQualifier Property werden nun die Datensätze mit bzw. ohne eingebundene doppelte Anführungszeichen in der strOutput Variable gespeichert. Solange die Variable, die den Feldindex (FieldIndex) enthält, ungleich mit der Summe der Datenspaltenanzahl ist, werden Kommas als benötigte Trennungszeichen zwischen den einzelen Datenspalten eingefügt. Falls die letzte Spalte erreicht ist, d.h. die beiden zu vergleichenden Werte gleich sind, wird kein Komma nach der letzten Spalte eingefügt. Da nun die letzte Datenspalte erreicht wurde, signalisieren wir mit vbCrLf eine neue Zeile um dann mit der nächsten Datenreihe zu beginnen.

Da danach die für die Datenbankverbindung benötigten Objekte nicht mehr gebraucht werden, können wir die Verbindung mit Close schließen und die Objekte mit Nothing wieder zerstören. Was noch fehlt ist die Erstellung der CSV-Datei (Dateiendung csv) und das Einfügen der Daten, die zwischenzeitlich in der strOutput Variable gespeichert wurden:

    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(strOutputFilePath, ForWriting, True)
    objFile.Write strOutput
    
    objFile.Close
    Set objFSO = Nothing
  End Sub
End Class

Zuerst instanzieren wir mit Server.CreateObject ein neues Objekt, das wir für die Dateioperationen benötigen. Mit der OpenTextFile Methode erstellen wir eine neue Datei. Dabei übergeben wir den physikalischen Pfad der neuen CSV-Datei und weisen an, daß der IO-Mode nur Schreibzwecke erfüllen soll. True gibt zusätzlich an, daß eine neue Datei erstellt werden soll, andernfalls wird eine vorhandene mit dem gleichen Namen überschrieben.

Da wir oben mit vbCrLf schon für den Zeilenumbruch gesorgt haben, können wir hier einfach den Inhalt der strOutput Variable mit der Write Methode des FileSystem Objektes in die neu erstellte Datei schreiben. Nachdem dies erfolgt ist, schließen wir den Textstream mit Close und zerstören wieder das vorher erstellte Objekt. Das war's für die VBScript Klasse - simpel und einfach wiederzuverwerten.

Abschließend möchte ich noch mit einer einfachen ASP Datei die Verwendung der VBScript-Klasse demonstrieren. Hierfür habe ich die einfache Access Datenbank mdb2csv.mdb benutzt. Als Demo reicht die einfache Struktur der Accessdatenbank, die im real-life Anwendungsfall natürlich umfangreicher sein kann:

Der Sourcecode der TestConvertToCSV.asp sieht dabei so aus:

<!-- #include file="MDB2CSVClass.asp" --> 

<%
    Dim objMDB2CSV
    Set objMDB2CSV = New MDB2CSV
    
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("mdb2csv.mdb")
    strSQL = "SELECT PK_ProdId, ProdName, ProdDescr FROM tProducts"
    strOutputFilePath = "C:\\test.csv"
    objMDB2CSV.UseTextQualifier = true
    objMDB2CSV.ConvertToCSV strConn, strSQL, strOutputFilePath
    
    Set objMDB2CVS = Nothing
%>

Einfach mit einer include Anweisung die MDB2CSVClass.asp ASP Datei, die die VBScript Klasse enthält, einbinden. Zusätzlich noch die Property und die Parameter übergeben - fertig. Die erzeugte Datei können Sie dann in jedes CSV-kompatible DB-System importieren, zum Download freigeben, oder auch in z.B. Excel bzw. einfach im Notepad öffnen:

Schlußbemerkung

Dieser Artikel bot eine einfache Möglichkeit aus einer Access Datenbank mittels VBScript eine CSV-Datei zu erstellen. Natürlich können Sie statt Access Datenbanken mit diesem Script auch andere Datenbanken ins CSV-Format konvertieren, die OLEDB unterstützen. Was in diesem Beispiel noch fehlt sind Anweisungen für eine Maskierung von Beistrichen, etc. - und eine entsprechende Fehlerbehandlung.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010605.zip

Verwandte Artikel

Daten aus CSV-Dateien in MDBs importieren
http:/www.aspheute.com/artikel/20010607.htm
Datenbank zur Weiterbearbeitung in Excel bereitstellen
http:/www.aspheute.com/artikel/20001128.htm
Klassen in VBScript
http:/www.aspheute.com/artikel/20000526.htm
MS Access Datenbanken kompaktieren
http:/www.aspheute.com/artikel/20010321.htm
Schreiben einer Textdatei auf den Server
http:/www.aspheute.com/artikel/20000725.htm
Yet Another Access Database Administration Tool
http:/www.aspheute.com/artikel/20020410.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.