Announcement

Collapse
No announcement yet.

Datenimport CSV mit SQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datenimport CSV mit SQL

    Hallo zusammen,

    gibt es eine Möglichkeit über SQL eine CSV-Datei nach Access zu importieren?

    Mit dBase und der In-Klausel geht das. Hier der VBA-Code dazu:
    Sub dBase_einlesen()
    Dim strSQL$
    strSQL = " DELETE * FROM Tabelle;"
    DoCmd.RunSQL strSQL

    strSQL = "INSERT INTO Tabelle" & _
    "SELECT * " & _
    "FROM dBaseTabelle(ohne dbf)'' [dBase IV; DATABASE=D:\...\Rohdaten];"

    DoCmd.RunSQL strSQL

    End Sub
    ...Rohdaten ist der Ordner in dem die dBase steht. Voraussetzung sind identische Feldnamen und Reihenfolge und Datentypen. Alles soweit ok und funktioniert. Beim Test eines ähnlichen Codes kommt eine Fehler, dass die Datei nicht geöffnet werden kann. (Die Datei ist zu der Zeit nicht geöffnet)
    Mein Code:
    Sub Csv_einlesen()
    Dim strSQL$
    strSQL = " DELETE * FROM Tabelle;"
    DoCmd.RunSQL strSQL

    strSQL = "INSERT INTO Tabelle" & _
    "SELECT * " & _
    "FROM TXT(ohne *.txt) IN '' [Text; HDR=Yes; DATABASE=D:\...\Rohdaten; DELIMITER=';'];"

    DoCmd.RunSQL strSQL

    End Sub
    Hilfe wäre klasse - Danke!
    Gruß Thomas

  • #2
    Zugriff auf Textdatei via SQL

    Hallo zusammen,

    habe noch weiter experimentiert und folgenden Weg gefunden:
    Abfrage in Access:
    INSERT INTO Accesstabelle SELECT * FROM [Text; DATABASE=D:\Daten\...\Rohdaten; FMT=Delimited; HDR=Yes; IMEX=2; CharacterSet=852].Texttabelle.csv;

    Das Einzige das stört ist, dass die Spalten in der CSV durch Komma getrennt sein müssen. In einigen Tabellen, die zu importieren sind, sind Beträge mit Dezimalstellen (die mit Komma getrennt angeliefert werden). Ich würde ungern die Textdatei zunächst per Suchen und ersetzen (auch automatisiert) anpassen, bevor ich diese einlese. Hat jemand einen Vorschlag, wie ich den Delimiter beim Import über SQL (vermutlich ISAM) anpassen kann?

    Viele Grüße
    Thomas

    Comment


    • #3
      Hallo Thomas,

      das Einlesen auf diese Art erfolgt über die MS Jet Engine, die bietet nicht allzuviele Möglichkeiten. In dem ConnectionString kannst Du mit FMT nur zwischen TabDelimited und Delimited unterscheiden. Welches Trennzeichen verwendet wird, wird wiederum über die Registry ermittelt und kann nur dort geändert werden, siehe ziehe z.B. http://www.connectionstrings.com/textfile
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment


      • #4
        CSV via SQL einlesen

        Hallo Olaf,

        das hat mir schon sehr weiter geholfen - meine ursprüngliche Datei ist Tabulatorgetrennt - manchmal muss man Glück haben - nochmals danke für Deinen Hinweis!

        Gruß Thomas

        Comment


        • #5
          CSV via SQL in Access Datenbank einlesen

          Hallo zusammen,

          habe das Thema mal weiter untersucht. Es gibt die Möglichkeit die Daten per SQL-Befehl in Access einzulesen. Dabei können die unterschiedlichsten Trennzeichen verwendet werden (siehe http://msdn.microsoft.com/en-us/library/ms709353.aspx). Access greift über ODBC-Treiber auf die CSV-Daten zu.
          • Erste Voraussetzung ist ein entsprechender ODBC-Treiber für Text, welcher im Regelfall dann installiert ist, wenn auch Word, Excel oder PowerPoint installiert ist.
          • im Ordner in dem die zu importierenden Textdateien stehen, muss es eine schema.ini geben, die den Dateinamen der zu importierenden Datei enthält und außerdem die verschiedenen Parameter und die Spalten. Diese Ini kann man ensprechend dem unten aufgeführten Beispiel mit einem Texteditor erstellen. ggf. auch mit den Befehlen Input bzw. Output dynamisch erstellen.
          • Die hier verwendeten Feldnamen müssen exakt genauso in der Access-Tabelle vorliegen, wobei ein Punkt in Acces durch die Raute (#) erstezt werden muss, da Access keine Punkte akzeptiert.


          SQL-Befehle sehen dann so aus:
          INSERT INTO Accesstabelle
          SELECT *
          FROM (DateinameohneCSV) csv IN 'Pfad'[Text;FMT=TabDelimited;CharacterSet=1200;HDR=no];

          die schema.ini sieht so aus:

          [Dateiname.csv]
          ColNameHeader=True
          Characterset=UNICODE
          Format=TabDelimited
          Col1="Feldname 1" Char
          Col2="Feldname 2" Currency
          Col3="Feldname 3" Integer
          Col4="Feldname 4" Date
          Col5="Feldname 5" Float


          Viel Spass LG Thomas
          Zuletzt editiert von Kalli911; 08.04.2010, 17:37.

          Comment

          Working...
          X