PDA

Vollständige Version anzeigen : mehrere txt dateien einlesen


BKranz
19.06.2012, 11:20
Hallo Forum,

ich suche einen Weg, mehrere .txt Dateien in eine bestehende Tabelle anzufügen.

Die Textdateien sind immer gleich aufgebaut,
messung_0001.txt
messung_0002.txt
mesung_0003.txt usw.

und liegen immer auf C:\testpfad...
oder einfacher gesagt, durch klick auf eine Schaltfläche möchte ich alle .txt Dateien aus
dem Ordner C:\testpfad einlesen, und in die Tabelle tbl_Daten schreiben..
Bei erneuten ausführen sollen die bereits vorhandenen Einträge nicht nochmals angefügt werden.


Besten Dank im Voraus
Birgit

CptChaos
19.06.2012, 11:36
Was ist die konkrete Frage? Oder willst Du eine "Rundum-Sorglos-Paket" sprich Komplettlösung?

Vom Ansatz her:
Dateipfad auswählen (-> Stichwort: FileDialog)
Alle Dateien auswählen (-> Stichwort: FileDialog)
Für jede Datei etwas ausführen (-> Stichworte: Schleifenprogrammierung, Do Until, For Each, Do Loop)
Anfügen an Tabelle per SQL (-> Stichwort: INSERT INTO-Anweisung)

Damit keine doppelten DS vorkommen sollte eine entsprechende Indizierung vorgenommen werden (-> Stichworte: Primärschlüssel, Index)

BKranz
19.06.2012, 12:37
Hallo,

habe jetzt folgenden Code:
Dim FName As String, Path As String, i As Long
Path = "C:\Testpfad\"
FName = Dir(Path & "*.txt")
Do While FName <> ""

DoCmd.TransferText acImportDelim, "messdaten", "tbl_Daten", Path & FName
FName = Dir()
Loop

hier bekomme ich leider einen Laufzeitfehler 3625
Die Textdatei 'messdaten' exisitiert nicht.Importieren, Exportieren oder
Verknüpfen ist mit dieser Dateiangabe nicht möglich.

Was habe ich hier falsch gemacht?

Gruß
Birgit

Atrus2711
19.06.2012, 12:56
So wie es dasteht, müsste messdaten der Name einer Importspezifikation sein. Gibts die?

BKranz
19.06.2012, 13:28
Danke, Importspezifikation! daran ist es gelegen....

Gruß
Birgit

Lanz Rudolf
19.06.2012, 13:43
Hallo
Nur so neben bei gesagt ;)
gewöhne Dir an in solchen fällen:

FName <> "" und überhaupt im VBA-Code

Nicht "" zu Schreiben
Besser
FName <> vbNullString

dann must Du wenn Du einmal Dein Code optimierst dieses nicht an passen ;)

BKranz
19.06.2012, 15:09
Danke,

werde es mir zu Herzen nehmen...

FName <> "" und überhaupt im VBA-Code

Nicht "" zu Schreiben
Besser
FName <> vbNullString

dann must Du wenn Du einmal Dein Code optimierst dieses nicht an passen

Gruß
Birgit

BKranz
20.06.2012, 08:49
Hallo Forum,

Das einlesen von mehreren .txt Dateien habe ich mit folgendem Code
erreicht.
Dim FName As String, Path As String, i As Long
Path = "C:\Testpfad\"
FName = Dir(Path & "*.txt")
Do While FName <> vbNullString

DoCmd.TransferText acImportDelim, "messdaten", "tbl_Daten", Path & FName
FName = Dir()
Loop

leider werden mir die importierten Werte in der tbl_Daten Tabelle unter einander angezeigt also so wie Sie in der .txt-Datei aufgeführt sind.

Nun suche ich einen Weg jede importierte .txt Datei als einen Datensatz an in eine weitere Tabelle zu bekommen.

Aufbau der .txt Datei:
4; Mtks D; 114; 53; 100; 2; 1; ; ; 19.06.2012; 06:55:24 ; 0 0 0.000000 0
01 ; 1.3187; 1.3162; 1.3182; 1.3201; 1.3150; 1.3171; 50.02
02 ; 1.3144; 1.3194; 1.3177; 1.3174; 1.3136; 1.3122; 100.04
03 ; 1.3083; 1.3084; 1.3088; 1.3098; 1.3062; 1.3054; 150.07
04 ; 1.3056; 1.3038; 1.3046; 1.3048; 1.3020; 1.3014; 200.09
05 ; 1.3053; 1.3023; 1.3026; 1.3030; 1.3003; 1.2996; 250.11
06 ; 1.3055; 1.3039; 1.3032; 1.3028; 1.3002; 1.2994; 300.14
07 ; 1.3057; 1.3028; 1.3045; 1.3030; 1.2995; 1.2997; 350.16
08 ; 1.3066; 1.3040; 1.3052; 1.3032; 1.2996; 1.3003; 400.18
09 ; 1.3062; 1.3036; 1.3048; 1.3040; 1.2995; 1.2994; 450.20
10 ; 1.3063; 1.3033; 1.3043; 1.3032; 1.2994; 1.2984; 500.23

Besten Dank im Voraus
Birgit

Atrus2711
20.06.2012, 08:57
Nun suche ich einen Weg jede importierte .txt Datei als einen Datensatz an in eine weitere Tabelle zu bekommen
Versteh ich nicht. Wie kann eine Textdatei (=beliebig viele Sätze) ein Datensatz werden? Was willst du erreichen?

BKranz
20.06.2012, 09:30
Hallo,

also in so einer .txt Datei werden für ein Produkt Messungendaten erfasst.
die erste Zeile der .txt sind die Daten des Produkts (Mtks D) Datum und Uhrzeit.
Alle Zeilen darunter sind Messdaten. Ich suche nun eine Möglichkeit die daten in einer Tabelle zu erfassen, allerdings alles neben einander in einer Zeile (Datensatz).

etwa so sollte es in der Tabelle stehen....
Mtks D 114 19.06.2012 06:55:24 1.3187 1.3162 1.3182 1.3201 1.3150 1.3171 50.02 usw.

Gruß
Birgit

Atrus2711
20.06.2012, 09:35
allerdings alles neben einander in einer Zeile
werden die Felder dieser Tabelle dann gleichbedeutend sein, oder ist der erste Messwert in seiner Bedeutung ein anderer als der zweite?

Ich will darauf hinaus, dass alles nebeneinander in einer Zeile in aller Regel kein datenbanktypischer Ablauf ist und sich später nicht gut auswerten lässt.

BKranz
20.06.2012, 09:56
jede .txt -Datei die eingelesen wird soll in der gleichen Tabelle erfasst werden,
allerdings jede als ein Datensatz. es werden pro Tag etwa 10 .txt-Dateien erstellt, das heist 10 einträgen pro tag in der Tabelle.

Gruß
Birgit

Atrus2711
20.06.2012, 10:00
ich meinte eher, ob die Reihenfolge der Messwerte eine Bedeutung hat. Dürfte z.B, der rote und der blaue Wert vertauscht sein, ohne die Aussage der gesamten Messreihe zu ändern? Sprich: sind die einzelnen Messwerte "mehr desselben"?

Daten der Messreihe:
4; Mtks D; 114; 53; 100; 2; 1; ; ; 19.06.2012; 06:55:24 ; 0 0 0.000000 0
Daten der Messungen:
01 ; 1.3187; 1.3162; 1.3182; 1.3201; 1.3150; 1.3171; 50.02
02 ; 1.3144; 1.3194; 1.3177; 1.3174; 1.3136; 1.3122; 100.04
03 ; 1.3083; 1.3084; 1.3088; 1.3098; 1.3062; 1.3054; 150.07

BKranz
20.06.2012, 11:12
die Reihenfolge der Messwerte sollte nicht vertauscht werden, später möchte ich aus den Messwerten Min und Max Wert und die Toleranz der Messreihe erreichen.

gruß
Birgit

Atrus2711
20.06.2012, 11:23
später möchte ich aus den Messwerten Min und Max Wert und die Toleranz der Messreihe
Min und Max kannst du aber aus aus den Zeilen einer Spalte ermitteln, nicht aus den Spalten einer Zeile. Varianz ebenso.

Die Daten sollten später eher so aussehen:

Tabelle Messreihen ("Kopfdaten" einer Datei):
ID, Uhrzeit, weitere Felder (kann ich nicht deuten)

Tabelle Messwerte:
ID, F_Messreihe_ID, DurchlaufNr, Messwert

Aus dem Dateiblock für Messreihe 1
01 ; 1.3187; 1.3162; 1.3182; 1.3201; 1.3150; 1.3171; 50.02
02 ; 1.3144; 1.3194; 1.3177; 1.3174; 1.3136; 1.3122; 100.04wird also:
ID, F_Messreihe_ID, DurchlaufNr, Messwert
1 1 1 1.3187
2 1 1 1.3162
3 1 1 1.3201
4 1 1 1.3150
5 1 1 1.3171
6 1 1 50.02
7 1 2 1.3144
8 1 2 1.3194
...

BKranz
20.06.2012, 11:58
wenn das so machbar ist, wäre das Ok.
Das würde bedeuten für die erste Zeile der txt Dateien erstelle ich eine Tabelle
(tbl_Messreihen) und für die Messwerte eine weitere (tbl_Messwerte). Aber wie kann ich diese Tabellen nun mit den Daten der txt-Dateien befüllen?

Gruß
Birgit

Atrus2711
20.06.2012, 12:22
Ich würde jede Datei in eine Hilfstabelle importieren, die 12 Spalten hat (wenn ich richtig gezählt habe). Einen Code dafür hast du ja schon bekommen. Die Spalten sollten alle Text sein.

12 Spalten, weil die Kopfzeile 12 Felder hat; die Messwerte haben nur 8 Spalten, so dass in der Hilfstabelle die erste Zeile alle Felder belegt und die weiteren nur 8Felder. Es entsteht so ein Aufbau; nennen wir die Felder F1 bis F12.


4 ; Mtks D; 114 ; 53 ; 100 ; 2 ; 1 ; ; ; 19.06.2012; 06:55:24 ; 0 0 0.000000 0
01 ; 1.3187; 1.3162; 1.3182; 1.3201; 1.3150; 1.3171; 50.02


Nun kann das Anfügen an die Zieltabellen losgehen (ungetestet, aber im Prinzip so):
Dim lngMessreiheID as Long
Dim db as DAO.Database
Set db = CurrentDb
'Anfügen der Messreihe aus der Kopfzeile (Erkennung: F 12 ist nicht leer). Feldnamen der Zieltabelle anpassen!
db.Execute "INSERT INTO Messreihen (Feld1, Feld2, Feld3, Feld4, Feld5, Feld6, Feld7, Feld8) " _
& "SELECT F1, F2, F3, F4, F5, F6, F7, F8 " _
& FROM Hilfstabelle " _
& "WHERE F12 Is Not Null", dbFailOnError
'Ermitteln der erzeugten Messreihe_ID
lngMessreiheID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0).Value
'Anfügen der Messwerte aus den weiteren Zeilen (Erkennung: F 12 ist leer)
'1. Wertspalte: F2
db.Execute "INSERT INTO Messwerte (F_Messreihe_ID, DurchlaufNr, Messwert) " _
& "SELECT " & lngMessreiheID & " AS Messreihe, " _
& "F1 AS Durchlauf, " _
& "F2 AS Messwert " _
& "FROM Hilfstabelle " _
& "WHERE F12 Is Null", dbFailOnError

'2. Wertspalte: F3
db.Execute "INSERT INTO Messwerte (F_Messreihe_ID, DurchlaufNr, Messwert) " _
& "SELECT " & lngMessreiheID & " AS Messreihe, " _
& "F1 AS Durchlauf, " _
& "F3 AS Messwert " _
& "FROM Hilfstabelle " _
& "WHERE F12 Is Null", dbFailOnError

'3. Wertspalte: F4
db.Execute "INSERT INTO Messwerte (F_Messreihe_ID, DurchlaufNr, Messwert) " _
& "SELECT " & lngMessreiheID & " AS Messreihe, " _
& "F1 AS Durchlauf, " _
& "F4 AS Messwert " _
& "FROM Hilfstabelle " _
& "WHERE F12 Is Null", dbFailOnError

'etc für die 4.-8. Wertspalte

'Ende der Schleife.
'Hilfstabelle leeren für die nächste Datei
db.Execute "DELETE * FROM Hilfstabelle", dbFailOnError

'Nächste Datei