marcoit
Goto Top

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:

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

Content-Key: 168496

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

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: Clijsters
Clijsters 22.06.2011 um 16:43:13 Uhr
Goto Top
Hallöle Marco,

Set objFSO = 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
Mitglied: MarcoIT
MarcoIT 22.06.2011 um 17:07:51 Uhr
Goto Top
Also an dem ForReading (1) liegt es nicht, ich erhalte ja den Inhalt der Dateien(alt) in der Datei(neu)

Datei1 alt Inhalt:

Zeile1 Text1 aus Datei1 alt;
Zeile2 Text2 aus Datei1 alt;

Datei2 alt:

Zeile1 Text1 aus Datei2 alt;
Zeile2 Text2 aus Datei2 alt;

Und dann kommt das ganze in der neuen Datei so raus:

Zeile1 Text1 aus Datei1;
Zeile2 Text2 aus Datei1;

Zeile1 Text1 aus Datei2;
Zeile2 Text2 aus Datei2;

Das passt an sich... Ich werde mal deinen " 'FUNKTIONSUNTÜCHTIGES BEISPIEL " verwenden und ein wenig rumbasteln ich glaub ich bin gerade auf dem richtigen weg danke dir ;)
Mitglied: bastla
bastla 22.06.2011 um 17:08:54 Uhr
Goto Top
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:
'...  
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
Grüße
bastla
Mitglied: Clijsters
Clijsters 22.06.2011 um 17:17:38 Uhr
Goto Top
Es ist aber ein FUNKTIONSUNTÜCHTIGES BEISPIEL ;)

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
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 -.-
Mitglied: bastla
bastla 22.06.2011 um 17:51:42 Uhr
Goto Top
@dominique01520
Danke für die Blumen face-smile
Wenn du die Dateien einfach hintereinander machen möchtest
... gib in der CMD-Shell den Befehl
copy "C:\mein pfad\CSV\csv*.txt" "C:\mein pfad\csv_neu_neu.csv"
ein und gut ist ... face-wink

Grüße
bastla
Mitglied: MarcoIT
MarcoIT 28.06.2011 um 11:24:13 Uhr
Goto Top
So hallo ihr Zwei,

erstmal danke ich Euch das ihr mir geholfen habt.
Es geht soweit alles jetzt kommt nur noch die Fehlermeldung:

Erlaubnis verweigert

Muss schauen ich glaube das das eine Windows Einstellung ist die mir das erstellen von Dateien per Script verbietet.

Also danke nochmal wünsche noch einen angenehmen Arbeitstag ;)

Gruß Marco
Mitglied: Clijsters
Clijsters 28.06.2011 um 19:53:15 Uhr
Goto Top
[Nur OT]
Also danke nochmal wünsche noch einen angenehmen Arbeitstag ;)
Bitte/Danke - 8 Stunden, 34°C - Klimaanlage <> Vorhandensein

... gib in der CMD-Shell den Befehl
copy "C:\mein pfad\CSV\csv*.txt" "C:\mein pfad\csv_neu_neu.csv"
ein und gut ist ... face-wink
In Erinnerung an das VBScript, was Events in ein Exceldokument geschrieben hat, um es danach nach EventIDs zu ordnen.
...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