Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1636to1640
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SQL Abfrage aus mehreren CSV Dateien

SQL Abfrage aus mehreren CSV Dateien
29.07.2018 11:40:08
Ralf
Hallo,
ich möchte aus mehreren csv Dateien in einem Verzeichnis jeweils den Mittelwert aus einer Spalte per SQL abfragen. Bislang habe ich mich an einem Beispiel bedient, in dem die Abfrage über eine Schema.ini erfolgt. Da komme ich aber nicht weiter, zwar kann ich für jede abgefragte Datei eine neue Schema.ini erstellen, nur schaffe ich es nicht in der Select from Anweisung einen dynamischen Tabellennamen zu verwenden, der sich aus den einzelnen csv Dateien im Verzeichnis ergibt.
Hier mein bisheriger Code:

Option Explicit
'ADO Treiber für SQL Abfrage einrichten
Const ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
' Pfad für Schema.ini Datei anlegen
Public StrPathToTextFile As String
Sub DateienEinlesen()
'alle *.csv Dateien aus einem Verzeichnis auflisten
Dim objFSO As New Scripting.FileSystemObject
Dim objOrdner As Scripting.Folder
Dim objDatei As Object
Dim objDialog As FileDialog
Dim Zeile, letzteZeile As Long
Dim IDSpalte, IDZeile As Range
Set objDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objDialog
.InitialFileName = "C:\Test\"
.Show
If .SelectedItems.Count = 0 Then
Exit Sub
End If
Set objOrdner = objFSO.GetFolder(.SelectedItems(1))
End With
With Sheets("Zusammenfassung")
.Cells.Clear
Zeile = 2
.Range("A1:C1").Value = Array("ID", "Wert", "Stabw_Wert")
For Each objDatei In objOrdner.Files
'nur csv Dateien listen
If objDatei.Name Like "*.csv" Then
.Range("A" & Zeile).Value = objDatei.Name
Zeile = Zeile + 1
End If
Next objDatei
End With
'ADO Abfrage
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim sqlstring As String
sqlstring = objOrdner & "\"
With Sheets("Zusammenfassung")
'ADO Verbindung herstellen
cnt.Open ConnectionString & sqlstring & ";Extended Properties=""text;HDR=No"";"
'sequentielle Abfrage für alle IDs in Spalte A
letzteZeile = Sheets("Zusammenfassung").Cells(Rows.Count, 1).End(xlUp).Row 'zunächst letzte  _
_
_
Spalte im Blatt Zusammenfassung nach Abfrage bestimmen
Set IDSpalte = Sheets("Zusammenfassung").Range("A2:A" & letzteZeile) 'Bereich, der  _
sequentiell abgearbeitet werden soll definieren
For Each IDZeile In IDSpalte
'Schema.ini Datei mit Importspezifikation anlegen
StrPathToTextFile = objOrdner
Open StrPathToTextFile & "\schema.ini" For Output As #1
Print #1, "[" & IDZeile & "]"
Print #1, "Format=CSVDelimited"
Print #1, "ColNameHeader=false"
Print #1, "decimalsymbol=."
Print #1, "Col1=x long"
Print #1, "Col2=y long"
Print #1, "Col3=Wert double"
Close #1
'Recordset abrufen
rst.Open "SELECT AVG(Wert), StDev(Wert) FROM ['" & IDZeile & "']", cnt, adOpenKeyset,   _
_
_
adLockOptimistic
.Range("B2").CopyFromRecordset rst
IDZeile.Value = Left(IDZeile, Len(IDZeile) - 4)
Next IDZeile
'Verbindung schließen
cnt.Close
end with
End Sub

Ich erhalte immer eine Fehlermeldung, "Das MS JET Datenbankmodul konnte das Objekt ... nicht finden. Vielen Dank für eure Hilfe.
Ralf

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SQL Abfrage aus mehreren CSV Dateien
29.07.2018 12:12:43
Oberschlumpf
Hi Ralf,
du könntest auf Antwort(en) warten, oder du liest dir das hier mal durch:
https://www.herber.de/forum/messages/1636461.html
Ja, ich weiß, du bist nicht Peter, aber.....ich denke, du weißt, was ich meine ;-)
(speziell bei deiner Frage könnte es hilfreich sein, wenn du auch 1 oder 2 csv-Dateien (mit Bsp-Daten) per Upload zeigst)
Ciao
Thorsten
AW: SQL Abfrage aus mehreren CSV Dateien
29.07.2018 21:47:59
Ralf
Hallo Thorsten,
leider kann ich keine Beispieldatei im *.csv Format hochladen.
Um mich verständlicher auszudrücken (danke für den Hinweis):
In mehreren Verzeichnissen befinden sich jeweils mehrere *.csv Dateien, die alle gleich aufgebaut sind.
(kein header, 3 Spalten, Trennzeichen zwischen den Spalten: Komma, Dezimaltrennzeichen: Punkt, mich interessiert nur die 3. Spalte). Bei den Dateien ist die Anzahl der Zeilen nicht immer gleich. In einem Verzeichnis können auch andere Dateitypen sein, die Anzahl der csv Dateien je Verzeichnis ist unterschiedlich.
Ich möchte deshalb in einer Abfrage ein Verzeichnis auswählen und alle csv Dateien aus dem gewählten Verzeichnis in Spalte A einer Excel Tabelle auflisten.
In Spalte B soll dann der jeweilige Mittelwert aus der dritten Spalte der csv Datei stehen, in Spalte C die Standardabweichung.
Bsp. für eine csv Datei:
1,2,10.5
1,3,10.2
Wenn ich in meinem Code eine Datei (z.B.: test.csv) namentlich in die eckigen Klammern schreibe
Codezeile:
rst.Open "SELECT AVG(Wert), StDev(Wert) FROM [test.csv]", cnt, adOpenKeyset, adLockOptimistic
funktioniert alles, (der 3. Spalte der csv Dateien weise ich mit einer Schema.ini Datei den Namen Wert zu)
Nur funktioniert es eben nicht die Dateinamen, die durch das Makro in Spalte A gelistet sind in die Abfragezeile des Recordset zu setzen. In meinem Code wird hierzu eine for next Schleife durchlaufen, die Variable mit dem gerade abzufragenden Dateinamen wäre IDZeile.
Ich hoffe das klingt verständlicher ...
Grüße, Ralf
Anzeige
siehste, deswegen...
29.07.2018 22:16:06
Oberschlumpf
Hi Ralf,
...find ich es eigtl immer besser, wenn vom Fragenden Excel-Bsp-Dateien per Upload gezeigt werden.
Zitat aus deinem ersten Text:
"ich möchte aus mehreren csv Dateien in einem Verzeichnis"
Zitat aus deinem zweiten Text:
"In mehreren Verzeichnissen befinden sich jeweils mehrere *.csv Dateien..."
Hätte ich oder jemand anderes dir schon eine Antwort mit Code gegeben (nur auf deinen ersten Text bezogen), müsste der Code teilweise neu programmiert werden!
Der "alte" Code muss sich auf ein Verzeichnis beziehen, weil du von einem Verzeichnis geschrieben hattest.
Da aber nun mehrere Verzeichnisse vom Code berücksichtigt werden müssen, wäre der alte Code (hätte es ihn denn gegeben) umsonst gewesen. Ja, ich weiß, hier ist alles umsonst, nix kostet etwas.
Aber die vergeudete Zeit, da hätte zumindest ich mich schon geärgert.
Nun denn. Ich wünsch dir viel Erfolg.
Ich weiß leider keine Lösung.
Ciao
Thorsten
Anzeige
AW: SQL Abfrage aus mehreren CSV Dateien
29.07.2018 22:51:36
Jürgen
Hallo Ralf,
ohne es getestet zu haben: wenn es mit [test.csv] funktioniert, warum setzt Du in Deinem Code den Dateinamen in einfache Anführungsstriche? Versuche es mal mit
rst.Open "SELECT AVG(Wert), StDev(Wert) FROM [" & IDZeile & "]", cnt, adOpenKeyset,  _
adLockOptimistic
Gruß, Jürgen
AW: SQL Abfrage aus mehreren CSV Dateien
03.08.2018 16:20:49
Ralf
Hallo,
Jürgen hat den entscheidenden Hinweis geliefert.
Danke, so klappts.
Grüße,
Ralf

111 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige