VBS CSV Dateien auslesen und neu Schreiben
Hallo Zusammen,
ich versuche gerade 2 Dateien auszulesen und in einer neuen Datei formatiert in eine art Tabelle zu schreiben.
Ich habe bereits versucht mit einer FOR-Schleife meine Dateien zu zählen und diese in einen Array zu schreiben.
Dies geht aber nicht. Ich bin aber soweit, dass ich meinen Text aus beiden Quelldateien erhalte aber nicht "formatiert" in eine neu erstellte Datei einschreiben lassen kann.
Bisher habe ich alle Inhalte untereinander aber wie ich möchte:
Zeile1 Text1 aus Datei1; Zeile1 Text1 aus Datei2;
Zeile2 Text2 aus Datei1; Zeile2 Text2 aus Datei2;
usw...
Die Quelldateien sind einfache CSV Dateien die mit einem Semikolon getrennt werden.
Wenn ich meine Dateien in meinem Ordner zählen möchte kommt immer der Fehler das ein Anweisungsende erwartet wird aber wieso? Andere haben das im Internet auch verwendet:
Ich bekomme das nicht hin mit den Dateien in einen Array speichern bzw nacheinander auszulesen und per FOR Schleife die Text zu schreiben.
Hier mein bisheriger Quellcode:
Hoffentlich könnt ihr mir helfen wäre super nett.
Grüßle Marco
EDIT:
Habe mir noch einen kleinen "Pseudo Code" erstellt:
Datei1 open read
Datei2 open read
Datei3 open write
Schleife FOR EACH Zeile aus Datei 1 + 2
Lesen aktuelle (cur) Zeile von Datei1 in Array1
Lesen aktuelle (cur) Zeile von Datei2 in Array2
String3 = Funktion (Array1 , Array 2)
Write String3 in Datei3
Schleifen Ende
Datei 1 + 2 + 3 Close
ich versuche gerade 2 Dateien auszulesen und in einer neuen Datei formatiert in eine art Tabelle zu schreiben.
Ich habe bereits versucht mit einer FOR-Schleife meine Dateien zu zählen und diese in einen Array zu schreiben.
Dies geht aber nicht. Ich bin aber soweit, dass ich meinen Text aus beiden Quelldateien erhalte aber nicht "formatiert" in eine neu erstellte Datei einschreiben lassen kann.
Bisher habe ich alle Inhalte untereinander aber wie ich möchte:
Zeile1 Text1 aus Datei1; Zeile1 Text1 aus Datei2;
Zeile2 Text2 aus Datei1; Zeile2 Text2 aus Datei2;
usw...
Die Quelldateien sind einfache CSV Dateien die mit einem Semikolon getrennt werden.
Wenn ich meine Dateien in meinem Ordner zählen möchte kommt immer der Fehler das ein Anweisungsende erwartet wird aber wieso? Andere haben das im Internet auch verwendet:
Dim fol As FileSystemObject
Basis = "C:mein pfad mit Ordner\"
Dim Verzeichnis As Folder
Set fol = New FileSystemObject
Set Verzeichnis = fol.GetFolder(Basis)
'Anzahl der Dateien im Odrner (ohne Unterverzeichnisse):
anz = Verzeichnis.Files.Count
MsgBox (anz)
Ich bekomme das nicht hin mit den Dateien in einen Array speichern bzw nacheinander auszulesen und per FOR Schleife die Text zu schreiben.
Hier mein bisheriger Quellcode:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\mein pfad\desktop\csv_neu.csv", 1)
Set fso = CreateObject("Scripting.FileSystemObject")
Set fsoc = fso.CreateTextFile("C:\mein pfad\csv_neu_neu.csv", 1)
Set txtfile = objFSO.OpenTextFile("C:\mein pfad\CSV\csv1.txt", 1)
Set txtfile2 = objFSO.OpenTextFile("C:\mein pfad\desktop\CSV\csv2.txt", 1)
REM Set txtfile = objFSO.ReadTextFile("C:\mein pfad\16029105-37837.txt", 1)
IF objFile is nothing Then
Wscript.Echo("objFile ist nichts")
Wscript.Exit()
END IF
FileName = "csv_neu.csv" ' Der Name der neu erstelen Datei in diese werden die Daten eingeschrieben
Const fsForReading = 1
Dim oStream ' As TextStream
Dim FileName ' As String
Dim anzahl ' As Integer
Dim a ' As String
Dim result ' As String
Dim strDateiname, strInhalt, strInhaltHTML ' As String
Dim objFs ' FileSystemObject Objekt
Dim objTextStream ' Textstream Objekt
Basis = "C:\mein pfad\desktop\CSV\"
Typ = "txt"
Set oStream = objFSO.CreateTextFile(FileName, True) ' Ist die csv_neu.csv oben deklariert
IF oStream is nothing Then
Wscript.Echo("oStream ist nichts")
Wscript.Exit()
END IF
Dim fol As FileSystemObject
Dim Verzeichnis As Folder
Set fol = New FileSystemObject
Set Verzeichnis = fol.GetFolder(Basis)
'Anzahl der Dateien im Odrner (ohne Unterverzeichnisse):
anz = Verzeichnis.Files.Count
MsgBox (anz)
FOR EACH Datei in fso.GetFolder(Basis).Files
strDateiname = Datei
Set objFs = CreateObject("Scripting.FileSystemObject")
Set objTextStream = objFs.OpenTextFile(strDateiname, fsForReading)
strInhalt = objTextStream.ReadAll
a = Split(result, ";")
oStream.WriteLine Trim(a(0)) ' Die writeline mache ich nur testweise das ganze wird noch automatischgemacht da die csv nicht immer nur 6 zeilen beinhaltet
oStream.WriteLine Trim(a(1))
oStream.WriteLine Trim(a(2))
oStream.WriteLine Trim(a(3))
oStream.WriteLine Trim(a(4))
oStream.WriteLine Trim(a(5))
result = Join(a, ";" & vbCrLf)
NEXT
objFile.Close
txtfile.Close
Hoffentlich könnt ihr mir helfen wäre super nett.
Grüßle Marco
EDIT:
Habe mir noch einen kleinen "Pseudo Code" erstellt:
Datei1 open read
Datei2 open read
Datei3 open write
Schleife FOR EACH Zeile aus Datei 1 + 2
Lesen aktuelle (cur) Zeile von Datei1 in Array1
Lesen aktuelle (cur) Zeile von Datei2 in Array2
String3 = Funktion (Array1 , Array 2)
Write String3 in Datei3
Schleifen Ende
Datei 1 + 2 + 3 Close
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 168496
Url: https://administrator.de/contentid/168496
Ausgedruckt am: 25.11.2024 um 22:11 Uhr
7 Kommentare
Neuester Kommentar
Hallöle Marco,
Normalerweise reicht es, einmal ein Objekt zu erstellen...
Ich habe das so verstanden, dass du mehrere CSVs zu einer zusammenfassen möchtest.
Das heisst, du definierst z.B. 4 CSVs, liest jede aus und schreibst dann den Inhalt in eine einzige.
u.U. daran, dass du die Dateien alle (zumindest, nachdem, was ich bisher gelesen habe) ausschließlich "ForReading"(1) öffnest?
Wenn du ein Array erstellst, in dem die Dateien vorhanden sind
z.B. Arr(0)="Datei1", Arr(1)="Datei2" usw.
Kannst du diese mit einer For-Schleife abarbeiten (For i = 0 to Arr.Count) (Wenn ich mich nicht irre)
und dann merken.
Für jede Datei erstellst du dann eine Zeile in deiner neuen CSV.
ungefähr so:
Gruß
Dominique
Set objFSO = CreateObject("Scripting.FileSystemObject") [...]
Set fso = CreateObject("Scripting.FileSystemObject") [...]
Set objFs = CreateObject("Scripting.FileSystemObject") [...]
Set fso = CreateObject("Scripting.FileSystemObject") [...]
Set objFs = CreateObject("Scripting.FileSystemObject") [...]
Normalerweise reicht es, einmal ein Objekt zu erstellen...
Ich habe das so verstanden, dass du mehrere CSVs zu einer zusammenfassen möchtest.
Das heisst, du definierst z.B. 4 CSVs, liest jede aus und schreibst dann den Inhalt in eine einzige.
Ich bekomme das nicht hin mit den Dateien in einen Array speichern bzw nacheinander auszulesen und per FOR Schleife die Text zu schreiben.
Wo genau hapert es denn?u.U. daran, dass du die Dateien alle (zumindest, nachdem, was ich bisher gelesen habe) ausschließlich "ForReading"(1) öffnest?
Wenn du ein Array erstellst, in dem die Dateien vorhanden sind
z.B. Arr(0)="Datei1", Arr(1)="Datei2" usw.
Kannst du diese mit einer For-Schleife abarbeiten (For i = 0 to Arr.Count) (Wenn ich mich nicht irre)
und dann merken.
Für jede Datei erstellst du dann eine Zeile in deiner neuen CSV.
ungefähr so:
'Deklarieren, definieren....
'FUNKTIONSUNTÜCHTIGES BEISPIEL
For i = 0 to DateiArray.Count
Do Until FSODatei.AtEndOfStream
Dateialt = Dateialt & ";" & FSODatei.ReadLine
Loop
FSODateiNeu.WriteLine Dateialt
Dateialt = Nothing
Next
N
Gruß
Dominique
Hallo MarcoIT!
Was es mit dem Dateien zählen auf sich hat, habe ich zwar noch nicht verstanden, aber wenn es darum geht, 2 Dateien zeilenweise zu kombieren, würde ich einfach beide in jeweils ein Zeilen-Array einlesen - schematisch etwa so:
Grüße
bastla
Was es mit dem Dateien zählen auf sich hat, habe ich zwar noch nicht verstanden, aber wenn es darum geht, 2 Dateien zeilenweise zu kombieren, würde ich einfach beide in jeweils ein Zeilen-Array einlesen - schematisch etwa so:
'...
Datei1Zeilen = Split(fso.OpenTextFile(txtfile1).ReadAll, vbCrLf)
Datei2Zeilen = Split(fso.OpenTextFile(txtfile22).ReadAll, vbCrLf)
If UBound(Datei1Zeilen) <> UBound(Datei2Zeilen) Then
WScript.Echo "Zeilenanzahl unterschiedlich!"
WScript.Quit 1
End If
Set Datei3 = fso.CreateTextFile(FileName)
For i = 0 To UBound(Datei1Zeilen)
Datei1Felder = Split(Datei1Zeilen(i), ";")
Datei2Felder = Split(Datei2Zeilen(i), ";")
Datei3.WriteLine Trim(Datei1Felder(0)) & ";" & Trim(Datei2Felder(0)) & ";" '...
Next
bastla
Es ist aber ein FUNKTIONSUNTÜCHTIGES BEISPIEL ;)
Folgendermaßen sollte es gehen:
In der Enddatei ist dann für jede Quelldatei eine Zeile vorhanden...
Wenn du die Dateien einfach hintereinander machen möchtest, setz das WriteLine in die Do Until Schleife...
Gruß
Dominique
[EDIT]
PS.:
Bastla machts besser -.-
Folgendermaßen sollte es gehen:
'Hier wird das FileSystemObject kreirt...
Set FSO = CreateObject("Scripting.FileSystemObject")
'Die Dateien werden definiert, hier können beliebig vile Dateien verwendet werden...
Datei(0) = "CSV1.csv"
Datei(1) = "CSV2.csv"
Datei(2) = "CSV3.csv"
Datei(3) = "CSV4.csv"
'Ausgabedatei
Dateineu = "Ausgabe.CSV"
'-----------------------------------
'AusgabeDatei zum Schreiben öffnen
FSOAusgabe = FSO.OpenTextFile(Dateineu, 2)
'For Schleife für die ganzen Dateien
For i = 0 to Datei.Count
FSOLese = FSO.Opentextfile(Datei(i), 1)
'Schleife jeweils durch die Datei, bis zum Ende
Do Until FSOLese.AtEndOfstream
Eingang = Eingang & ";" & FSOLese.ReadLine '<- Jede Datei wird nur in eine Zeile geschrieben. Das ist änderbar.
Loop
'Date 1 wird in Zeile 1 geschrieben, Datei 2 in eine neue Zeile...
FSOAusgabe.WriteLine Eingabe
'Variablen werden dedefiniert, oder wie man es im Fachjargon auch nennen mag ;)
FSOLese = Nothing
Eingabe = Nothing
'Hier ist ende...
Next
Wenn du die Dateien einfach hintereinander machen möchtest, setz das WriteLine in die Do Until Schleife...
Gruß
Dominique
[EDIT]
PS.:
Bastla machts besser -.-
[Nur OT]
...um später erschütternd zu merken, dass man in einer Listenansicht auch einfach auf die Spaltenüberschrift klicken kann xD
Unglaublich, aber war.
[/Nur OT]
Grüße zurück
Also danke nochmal wünsche noch einen angenehmen Arbeitstag ;)
Bitte/Danke - 8 Stunden, 34°C - Klimaanlage <> Vorhandensein... gib in der CMD-Shell den Befehl
ein und gut ist ...
In Erinnerung an das VBScript, was Events in ein Exceldokument geschrieben hat, um es danach nach EventIDs zu ordnen.copy "C:\mein pfad\CSV\csv*.txt" "C:\mein pfad\csv_neu_neu.csv"
...um später erschütternd zu merken, dass man in einer Listenansicht auch einfach auf die Spaltenüberschrift klicken kann xD
Unglaublich, aber war.
[/Nur OT]
Grüße zurück