MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 10.08.2018, 11:30   #1
MrOleks
Neuer Benutzer
Neuer Benutzer
Standard Acc2016 - Einlesen von CSV Dateien in Access Datenbank

Hallo liebe MS Office Community,

leider kenne ich mich so gut wie gar nicht in VBA aus und hoffe in diesem Forum auf etwas Unterstützung.

Folgende Problemstellung habe ich:

Ich habe eine Accessdatenbank mit einer großen Tabelle. Diese Tabelle hat als Primary Key das Datum und viele weitere Felder für verschiedene Messwerte.
Nun versuche ich aus verschiedenen Quellen (welche als CSV-Dateien vorliegen) die Messwerte in meine große Tabelle einzufügen.

Mit diesem Code tue ich erstmal alle Daten mit meiner DB verlinken:

Sub LinkCSV()

Dim strFile As String
Dim strPath As String
Dim strTable As String
strPath = "C:UsersOleksandrDownloadsmoni_in"
strFile = Dir(strPath & "*.csv")
Do While Len(strFile) > 0
strTable = Left$(strFile, Len(strFile) - 4)
DoCmd.TransferText acLinkDelim, TableName:=strTable, _
FileName:=strPath & strFile, HasFieldNames:=True
strFile = Dir()
Loop

End Sub

Das funktioniert aber suboptimal, da meine Werte mit einem ; getrennt sind und das Skript alles in eine Zeile schreibt. Das Problem kann irgendwie mit Workbook.open gelöst werden, aber egal wie ich es anstelle, bekomme ich ein Laufzeitfehler und verzweifel langsam daran .

Als zweites Problem schaffe ich es auf keinen eleganten Weg die verlinkten Tabellen zusammen zu führen (via JOINT) mit dem Bezug auf das Datum, welches in jeder Tabelle CSV Tabelle ebenfalls vorhanden ist.

Ich wäre für jede Art von Input sehr dankbar .
MrOleks ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 11:40   #2
gpswanderer
MOF Guru
MOF Guru
Standard

Hallo,

Zitat:

Diese Tabelle hat als Primary Key das Datum und viele weitere Felder für verschiedene Messwerte.

Da beginnt dann schon das Problem.
Die Messwerte sollten als je ein Datensatz mit einem Bezug zur Messstelle gespeichert werden.
Ist die Anzahl der Messwerte in jeder CSV immer gleich (auch immer die gleichen Messtellen) ?

Zitat:

da meine Werte mit einem ; getrennt sind

In der Access Tabelle oder in der CSV ?
Sind die Messwerte immer in der gleichen Reihenfolge ?

__________________

Gruß
Klaus
Office2016, Win10

Geändert von gpswanderer (10.08.2018 um 11:43 Uhr).
gpswanderer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 11:49   #3
MrOleks
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Erstmal danke für die schnelle Antwort.

Also die CSV Dateien haben in der ersten Spalte immer das Datum und je nach Datei immer 1-4 Messwerte, welche immer mit einem ; voneinander getrennt sind.

Wie geht man hier sinnvoll und strukturiert vor?
MrOleks ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 11:54   #4
gpswanderer
MOF Guru
MOF Guru
Standard

Hallo,
und hast Du die Hinweise zum Aufbau der Access Tabelle gelesen ?
Eine Accesstabelle nicht querorientiert wie Excel.
In einer Accesstabelle sollte jeder Messwert ein Datensatz sein. Das Datum wiederholt sich dann, daher kann das Datum nicht der Primärschlüssel sein.

Haben diese 1-4 Messwerte Bezeichnungen, oder wie unterscheidest Du diese in der Accesstabelle, über die Spaltennamen ?

__________________

Gruß
Klaus
Office2016, Win10
gpswanderer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 12:01   #5
MrOleks
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Die CSVs werden ja erstmal nur verlinkt und da ist das Datum nicht der PK.
Die Idee ist, die ganzen verlinkten Tabellen zu einer großen zusammen zu führen und dann entsprechend des Datums die Werte in die "richtige" Tabelle übertragen.

Die Messwerte haben alle in der Bezeichnung, entweder als Überschrift der Spalten oder im Dateinamen der CSVs.

Kann man hier irgendwie Dateien anhängen? Dann könnte ich es einfach zeigen
MrOleks ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 12:08   #6
gpswanderer
MOF Guru
MOF Guru
Standard

Hallo,
Du hast immer noch nicht verstanden was ich Dir sagen will.
Die Access Tabelle ist falsch aufgebaut.

Du brauchst hier mindestens mal 2 Tabellen:

- Messtellen (MesstelleID, Messstellenbezeichnung)
- Messwerte (MesswertID, Datum, MesstelleID_F, Messwert)
In der 2. Tabelle gibt jeder Messwert ein Datensatz.

Was enthält denn Deine jetzige Access Tabelle noch für Felder außer dem Datum und den Feldern für die Werte ?

Die verlinkten CSV Daten werden dann per VBA als je ein Datensatz übertragen.

Zitat:

entweder als Überschrift der Spalten oder im Dateinamen der CSVs.

Wenn in der CSV die Werte in einem Feld stehen, woran erkennst Du dann die Messtelle ?

__________________

Gruß
Klaus
Office2016, Win10
gpswanderer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 12:13   #7
hcscherzer
MOF Guru
MOF Guru
Standard

Prinzipiell würde ich immer versuchen, eine mit ";" getrennte csv-Datei über .TransferText einzulesen. Dabei lässt sich eine Importspezifikation definieren und verwenden, was sehr hilfreich sein kann.

Den Anmerkungen von Klaus hinsichtlich der mangelnden Normalisierung folgend, würde ich die Daten zuerst in eine temporäre Import-Tabelle einlesen und dann mit einer Prozedur oder Abfrage in die produktive (2.) Tabelle.

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 12:24   #8
MrOleks
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Vielen Dank,

so habe ich das auch eigentlich vor. Alle CSVs einlesen und diese in eine temp. Tabelle zusammenführen und übertragen.

DoCmd.TransferText acLinkDelim, TableName:=strTable, FileName:=strPath & strFile, HasFieldNames:=True

Wo kann ich hier irgendwas bezüglich ; spezifizieren?

@gpswanderer: Die Messstelle erkenne ich an der Überschrift der Spalten in den CSV Dateien.
MrOleks ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 12:30   #9
gpswanderer
MOF Guru
MOF Guru
Standard

Hallo,

Zitat:

Die Messstelle erkenne ich an der Überschrift der Spalten in den CSV Dateien.

Du hast doch aber nur eine Spalte mit ; getrennten Werten.

Und noch mal der Hinweis (mir scheint, das hast Du immer noch nicht verstanden):
Die Access TAbelle ist falsch aufgebaut.

Zitat:

Wo kann ich hier irgendwas bezüglich ; spezifizieren?

Was meinst Du damit ?

Du kannst hier Dateien anhängen.

__________________

Gruß
Klaus
Office2016, Win10
gpswanderer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 12:35   #10
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

Wie geht man hier sinnvoll und strukturiert vor?

Mein Vorschlag:

1) Datenmodell in Access fertigstellen, etwa so wie es Klaus beschreibt. Ein Datenmodell orientiert sich daran, wie die Daten in Folge gut verarbeitet werden können, nicht daran, in welcher Struktur die externen Daten daherkommen. Ein Import ist eine Schnittstelle, da kann man alles auf links drehen. Diese Chance kann man gleich nutzen - sonst macht man es später in den Verarbeitungen mit insgesamt mehr Aufwand.

2) Für die CSV eine Importspezifikation erstellen und diese per TransferText benutzen. Mit dem richtig eingestellten Spaltentrennzeichen hättest Du jeweils in der verlinkten Tabelle gleich die Aufteilung in Felder.
Ob die Spezifikation bei wechselnden Spaltenzahlen unmittelbar funktioniert, kann ich jetzt nicht sagen. Eine Spezifikation wird aber in zwei Systemtabellen in Access abgelegt, und über eine Änderung nach Bedarf könnte man Spezifikation und Datei aufeinander abstimmen. Oder man nimmt mehrere Spezifikationen, die sich dann nur in der berücksichtigten Spaltenzahl unterscheiden.
Nunmehr sind die verlinkten CSV als interne Tabellen verfügbar. Der Dateiname lässt sich wohl als Messstelle interpretieren.

3) Nunmehr kann man den Datenübertrag per Anfügeabfragen organisieren, das folgende kann da als Orientierung dienen: Grundlagen - SQL ist leicht (9) - Pivottabelle in Listtabelle umformen
Auf eine temporäre Tabelle kann man hier verzichten. Diese würde aus meiner Sicht auch nur Sinn machen,
- wenn neben dem reinen Anfügen auch Aktualisierungen der Zieltabelle gefragt sind (ein Bug untergräbt eine Aktualisierungsabfrage mit einer verknüpften Texttabelle),
- wenn man Felder der TempTabelle für eine bessere Abfrageperformance indiziert. Indizierung von solchen externen Datenquellen außerhalb einer Datenbank geht nicht.

4) Nunmehr können die Tabellenverlinkungen wieder entfernt und die CSV's archiviert oder gelöscht werden.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}
Dein Dankeschön: DBWiki=>Spende

Geändert von ebs17 (10.08.2018 um 12:45 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 12:53   #11
MrOleks
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Da die Dateien die 194 kB Grenze übersteigen, hier ein Link zu meinem Google Drive:

https://drive.google.com/open?id=1Ca...yxYkRg07N0M3BK

Da habe ich meine Datenbank + 3 Beispiel CSVs.

Es gibt eigentlich viel mehr aber das Prinzip müsste ja immer gleich sein.

Wie gesagt will die CSVs einlesen, zusammenführen und in die große Tabelle entsprechend die Werte eintragen.

Hoffe auf eure Unterstützung.
MrOleks ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 13:17   #12
gpswanderer
MOF Guru
MOF Guru
Standard

Hallo,
und zum wiederholten mal, der Aufbau der Access Tabelle ist falsch.
So lange Dir das nicht klar ist und die Tabelle umgebaut ist, machen weitere Erläuterungen keinen Sinn.

Eberhard hat Dir in #10 eine Anleitung geliefert.

__________________

Gruß
Klaus
Office2016, Win10
gpswanderer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 13:39   #13
MrOleks
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Die Sache ist, ich weiß gar nicht wie ich die Datenbank richtig aufziehen soll.
Ich habe ja pro Messwert einen Datensatz erstellt. Oder sind damit nicht die Spalten gemeint?

Ich schaffe es ja auch die notwendigen Abfragen (in der bereitgestellten Datenbank nicht vorhanden) zu erzeugen.


Nur der Datenimport klappt halt nicht.

Dann muss ich jetzt schauen wie ich das richtig aufbauen soll
MrOleks ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.08.2018, 14:02   #14
gpswanderer
MOF Guru
MOF Guru
Standard

Hallo,

Zitat:

Ich habe ja pro Messwert einen Datensatz erstellt.

nein, in Deinem Beispiel sind in einem Datensatz viele Messstellen.
Du brauchst je Messwert und je Messstelle ein Datensatz in einer extra Tabelle.
Bevor Du über den Import nachdenkst, muss erst die Struktur der Access Tabelle stimmen.

__________________

Gruß
Klaus
Office2016, Win10

Geändert von gpswanderer (10.08.2018 um 14:08 Uhr).
gpswanderer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.