jay0603
Goto Top

3 CSV Dateien automatisch einlesen und strukturiert in eine CSV integrieren

Hallo Zusammen,

ich habe leider keine Erfahrung mit VBA und versuche jetzt schon seit mehreren Tagen vergeblich eine Lösung für mein Problem zu finden. Da ich in diesem Forum viele gute, verwandte Beiträge gefunden habe, hoffe ich mich an euch wenden zu dürfen. Ich versuche aus 3 CSV Dateien die im Minutentakt aktualisiert werden immer die letzte (aktuellste) Zeile in einer gemeinsamen CSV Datei, transponiert in Spaltenform, darzustellen. Zudem sollte die erste Zeile der 3 CSV Dateien auch in Spaltenform in diese gemeinsamen CSV Datei übernommen werden.
Ich versuche das hier mal anhand eines Beispiels zu verdeutlichen:

Datei1.csv
Zeile 1 Text1;Text2;Text3;Text4
Zeile 2 Wert;Wert;Wert;Wert
Zeile 3 ..............................
Zeile 4 Wert;Wert;Wert;Wert (aktuelle Werte)

Datei2.csv
Zeile 1 Text5;Text6;Text7
Zeile 2 Wert;Wert;Wert
Zeile 3 ..............................
Zeile 4 Wert;Wert;Wert (aktuelle Werte)

Datei3.csv
Zeile 1 Text8;Text9;Text10
Zeile 2 Wert;Wert;Wert
Zeile 3 ..............................
Zeile 4 Wert;Wert;Wert (aktuelle Werte)

Die gemeinsame CSV sollte wie folgt aussehen:

Gemeinsam.csv
Text 1;Wert
Text 2;Wert
.
.
Text10;Wert

Dabei sollten die Werte in Spalte 2 automatisch immer durch die neusten Werte der 3 CSV Dateien ersetzt werden.
Die gemeinsame CSV wird dann für eine andere Anwendung benötigt. Ich verwende MS Excel 2007.

Es wäre sehr schön wenn mir jemand weiter helfen könnte. Vielen Dank schon mal im vorraus!

MfG Jay

Content-Key: 214865

Url: https://administrator.de/contentid/214865

Printed on: April 23, 2024 at 09:04 o'clock

Member: bastla
bastla Aug 21, 2013 updated at 12:49:51 (UTC)
Goto Top
Hallo Jay0603 und willkommen im Forum!

Könnte etwa so gehen:
Ein = Array("D:\Datei1.csv", "D:\Datei2.csv", "D:\Datei3.csv") 'Liste der zu verarbeitenden Dateien als Array  
Aus = "D:\Gemeinsam.csv" 'Ausgabedatei  
Delim = ";" 'Trennzeichen  

Set fso = CreateObject("Scripting.FileSystemObject")  

For Each Datei In Ein 'alle "Eingabe"-Dateien durchgehen  
    T = Split(fso.OpenTextFile(Datei).ReadAll, vbNewline) 'Dateiinhalt in Zeilenarray einlesen  
    F = Split(T(0), Delim) 'Feldnamen-Array aus Zeile 1 (= Index 0) erstellen  
    W = Split(T(UBound(T)), Delim) 'Werte-Array aus letzter Zeile erstellen  
    
    For i = 0 To UBound(F) 'alle Felder durchgehen  
        'Ausgabe zusammensetzen: Zeilenschaltung + Feldname + Trennzeichen + Wert  
        A = A & vbNewline & F(i) & Delim & W(i)
    Next
Next

fso.CreateTextFile(Aus).Write Mid(A, 3) 'ohne erste Zeilenschaltung in Ausgabedatei schreiben  
Vorausgesetzt (da nicht überprüft / abgesichert) wird, dass es in der letzten Zeile zumindest so viele Werte gibt, wie die erste Zeile Feldnamen enthält (und daher insbes nicht eine Zeilenschaltung am Dateiende vorkommt) ...

Grüße
bastla
Member: Jay0603
Jay0603 Aug 22, 2013 at 09:32:44 (UTC)
Goto Top
Hallo bastla,

vielen Dank für die schnelle Antwort und deine Bemühungen. Ich konnte die Funktion erst gerade eben testen. Leider bringt mir VB einen Laufzeitfehler mit der Fehlermeldung "Index außerhalb des gültigen Bereichs" bei folgender Zeile:

A = A & vbNewLine & F(i) & Delim & W(i)

Ich kenne mich leider viel zu wenig mit VB aus, werde aber versuche mich ein bisschen einzuarbeiten.

Grüße
Jay
Member: bastla
bastla Aug 22, 2013 at 12:29:30 (UTC)
Goto Top
Hallo Jay0603!
Fehlermeldung "Index außerhalb des gültigen Bereichs"
wäre dann genau der Fall, den ich oben erwähnt hatte: Vermutlich enthält mindestens eine der CSV-Dateien am Ende eine Leerzeile ...

Falls ja, sollte es so gehen:
Ein = Array("D:\Datei1.csv", "D:\Datei2.csv", "D:\Datei3.csv") 'Liste der zu verarbeitenden Dateien als Array  
Aus = "D:\Gemeinsam.csv" 'Ausgabedatei  
Delim = ";" 'Trennzeichen  

Set fso = CreateObject("Scripting.FileSystemObject")  

For Each Datei In Ein 'alle "Eingabe"-Dateien durchgehen  
    T = Split(fso.OpenTextFile(Datei).ReadAll, vbNewline) 'Dateiinhalt in Zeilenarray einlesen  
    F = Split(T(0), Delim) 'Feldnamen-Array aus Zeile 1 (= Index 0) erstellen  
    L = UBound(T) 'letzte Zeile ermitteln  
    'letzte nicht leere Zeile suchen  
    Do While Trim(T(L)) = ""  
        L = L -1
    Loop
    W = Split(T(L), Delim) 'Werte-Array aus letzter Zeile erstellen  
    
    For i = 0 To UBound(F) 'alle Felder durchgehen  
        'Ausgabe zusammensetzen: Zeilenschaltung + Feldname + Trennzeichen + Wert  
        A = A & vbNewline & F(i) & Delim & W(i)
    Next
Next

fso.CreateTextFile(Aus).Write Mid(A, 3) 'ohne erste Zeilenschaltung in Ausgabedatei schreiben  
Grüße
bastla
Member: Jay0603
Jay0603 Aug 22, 2013 at 12:41:47 (UTC)
Goto Top
Hallo bastla,

funktioniert genau wie beschrieben. Tausend Dank für deine Hilfe. Super Forum mit super Leuten hier!
Echt klasse!

Gruß
Jay