CSV- Datei in Access- DB importieren

bytebold

Grünschnabel
Hallo,

ich habe ein Problem beim importieren einer CSV- Datei in eine Access- Datenbank.
Im Prinzip funktioniert der Import, nur die Werte sind falsch und ich weiß nicht warum.
Die CSV- Datei hat folgenden Inhalt:

Code:
Datum;Uhrzeit;Temp1;Temp2;Temp3;Temp4;Temp5;Temp6;Hum1;Hum2;Bright;Wind1;Wind2;Baro;Rain;Dummy1;Dummy2;Dummy3
02.04.2007;00:00:40;20,1;13,3;13;0;0;0;42;0;50;0;0;0;0;0;0;0

Der Code sieht so aus:

Code:
Sub ImportTextToAccessADO()

Dim cnn As New ADODB.Connection
Dim sqlstring As String

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & PathtoMDB & "Messwerte.mdb"

sqlstring = "INSERT INTO [tblOrder] SELECT * FROM " & _
"[Text;DATABASE=C:\Messi\Messwerte\;HDR=yes;FMT=Delimited].[messwerte2007-04-02a.csv]"

cnn.Execute sqlstring

End Sub

In der Tabelle stehen nach Ausführung folgende Werte:

<02.04.2007> < 00:00:40> <0,834027777777778> <0,54375> <leer> <0> <0> <0> <42> <0> <50> usw.

Datum, Uhrzeit, der Wert 42 und 50 wurden korrekt importiert, anscheinend gibt es aber
Probleme mit den Kommastellen. Aus der 20,1 wird 0,834027777777778.
Die Felder sind in der Datenbank als Double deklariert.
Eine Schema.ini möchte ich nicht benutzen, da sich die Dateinamen ständig ändern.

Hat jemand einen Tip für mich ?

Gruß, bytebold
 
richtig das Problem sind die Kommastellen du benutzt , Access erwartet .

Mach es doch über die TransferTextmethode.
Einmalig importierst du die Datei von Hand dabei kannst du eine Spezifikation anlegen und speichern.

Den Namen der Spec kannst du dann für die Transfertext methode verwenden.

Grüsse bb
 
Hallo,

vielen Dank für die schnelle Antwort.

richtig das Problem sind die Kommastellen du benutzt , Access erwartet .

Da ich die CSV- Datei selber erzeuge, kann ich auch . als Dezimaltrennzeichen verwenden.
Habe ich ausprobiert, Access läßt aber in diesem Fall einfach das Kommazeichen weg und aus 20,1 wird 201.

Mit der Transfertext- Methode funktioniert der Import, läßt mir aber nicht die Möglichkeit, gezielt Daten aus der Datei zu importieren,
oder ? Ich möchte eigentlich prüfen, ob Daten aus der CSV- Datei schon in der Tabelle importiert sind und nur die Neuen importieren,
dafür ist SQL sehr flexibel zu gebrauchen.

Gruß, bytebold
 
Nein, mit der Transfertext kannst du keine Prüfung einbauen. Da geht es leider wirklich nur über ein Sql.

Da du aber die Zahl nach dem Komma wahrscheinlich brauchst, fallen mir nur zwei unschöne Ideen ein:

1. Möglichkeit
Zeilenweise die csv Datei einlesen die Daten zeilenweise per sql in Access schreiben.

2. Möglichkeit
Mit transfertext in eine Temporärtabelle laden dann die Vergleiche machen und die Dateien dann über ein
SQL:
insert into Tabelle Select * From tempTabelle

sonst hätte ich da keine Idee

Grüsse bb
 
Zuletzt bearbeitet von einem Moderator:
Hi,

2. Möglichkeit
Mit transfertext in eine Temporärtabelle laden dann die Vergleiche machen und die Dateien dann über ein

Dann werde ich diese Möglichkeit vorziehen.

Jetzt habe ich nun die Daten in einer 2. temporären Tabelle und will sie in die "Haupttabelle" einfügen.
Hat jemand ein kurzes SQL- Statement, mit dem ich anhand von Datum und Uhrzeit feststellen kann,
ob die Daten schon in der Haupttabelle vorhanden sind ?

Gruß, bytebold
 
Hallo

Du kannst trotzdem eine Schema.ini verwenden.

CSV Datei:
Code:
Datum;Uhrzeit;Temp1;Temp2;Temp3;Temp4;Temp5;Temp6;Hum1;Hum2;Bright;Wind1;Wind2;Baro;Rain;Dummy1;Dummy2;Dummy3
02.04.2007;00:00:40;20.1;13.3;13;0;0;0;42;0;50;0;0;0;0;0;0;0

Inhalt Schema.ini
Code:
[Test]
Format=Delimited(;)
DecimalSymbol=.

SQL:
Code:
sqlstring = "INSERT INTO [tblOrder] SELECT * FROM " & _
"[Text;DATABASE=C:\Messi\Messwerte\;HDR=yes;DSN=Test].[messwerte2007-04-02a.csv]"

So bleiben die Datei - und Feldnamen variabel.
 
Hallo,

danke für den Tip.

Ich benutze nun die TranferText- Methode und importiere die Daten in eine temporäre Tabelle.
Von dieser Tabelle kann ich dann mit SQL die gewünschten Daten herausfiltern und in die
Haupttabelle einfügen. Diese Möglichkeit ist gut zu gebrauchen.

Wen es interessiert hier die SQL- Abfrage nach Messwerten mit Datum, Uhrzeit > als in der
Haupttabelle vorhanden, wobei MesswerteImport die temp. Tabelle und Messwerte die Haupttabelle ist.
LastDatum und LastUhrzeit sind Variable, die aus dem letzen Datensatz der Haupttabelle
stammen, ([Datum]+[Uhrzeit]) ist das Access- Concat aus den zwei Feldern Datum und Uhrzeit.

Code:
    sqlstring = " INSERT INTO Messwerte" & _
                " SELECT * From MesswerteImport" & _
                " WHERE ((([Datum]+[Uhrzeit])>" & Format$(CDate(LastDatum), "\#dd\/mm\/yyyy\") & Format$(CDate(LastUhrzeit), "\ hh:nn:ss\#") & "))order by Datum, Uhrzeit;"

Gruß, bytebold
 
Zurück