apfeltoast
Goto Top

Mit VBS erste Zeile von CSV ändern

Hallo zusammen,

ich wurde von einem Arbeitskollegen beauftragt eine CSV-Datei automatisch zu editieren.
Die Ursprungsdatei hat 44 Spalten und sieht vom Aufbau exemplarisch so aus:

Textbox1; Textbox2; Dropdown1; Checkbox1
Herr;Meier;2;Ja
Frau;Müller;3;Nein

Die Datei soll dann im Endeffekt so aussehen:
Anrede;Nachname;Sparte;IBAN;Werbung;
Herr;Meier;2;<leer>;0
Frau;Müller;3;<leer>;1

Im Endeffekt möchte ich die die Reihenfolge der CSV ändern, zusätzliche Leerspalten einfügen und von allen Spalten die Überschrift ändern. Ferner sollen zusätzlich Werte wie "Ja" oder "Nein" umgewandelt werden in 0 und 1.

Ich habe bereits etwas Code mit Hilfe von hier in vbs geschrieben, welcher bereits die Felder in die richtige Reihenfolge angeordnet hat.
Kann mir jemand sagen, mit welchem Befehl ich die erste Zeile ändern kann und die entsprechenden Werte für "Ja" und "Nein" vergeben kann?


Alt = "C:\Eingabe\quelle.csv"  
Neu = "C:\Eingabe\ausgabe.csv"  
Delim = ";"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Zeilen = Split(fso.OpenTextFile(Alt).ReadAll, vbCrLf)
Set DateiNeu = fso.CreateTextFile(Neu)
For Each Zeile In Zeilen
    If Trim(Zeile) = "" Then 'Leerzeile oder nur Leerzeichen enthalten  
        ZeileNeu = Zeile
    Else
        Felder = Split(Zeile, Delim) 'anhand des Trennzeichens <Delim> in Felder zerlegen  
        ZeileNeu = _
            Felder(40) & Delim & _
			Delim & _
            Felder(3) & Delim & _
            Felder(18) & Delim & _
            Delim & _
	    Delim & _
	    Delim & _
            Felder(4) & Delim & _
            Felder(7) & Delim & _
            Felder(6) & Delim & _
	    Felder(12) & Delim & _
	    Felder (15) & Delim & _
	    Felder (9) & Delim & _
	    Felder (13) & Delim & _
	    Felder (14) & Delim & _
	    Felder (10) & Delim & _
	    Felder (11) & Delim & _
	    Delim & _
	    Felder (20) & Delim & _
	    Felder (23) & Delim & _
	    Felder (24) & Delim & _
            ...
	    Felder (25)
    End If
    DateiNeu.WriteLine ZeileNeu
Next

Vielen Dank vorab!

Gruß Apfeltoast

Content-Key: 272019

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

Ausgedruckt am: 28.03.2024 um 17:03 Uhr

Mitglied: bastla
Lösung bastla 14.05.2015, aktualisiert am 15.05.2015 um 13:39:11 Uhr
Goto Top
Hallo apfeltoast und willkommen im Forum!

Völlig ungetestet etwa so:
Alt = "C:\Eingabe\quelle.csv"  
Neu = "C:\Eingabe\ausgabe.csv"  
Delim = ";"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Zeilen = Split(fso.OpenTextFile(Alt).ReadAll, vbCrLf)
Set DateiNeu = fso.CreateTextFile(Neu)
DateiNeu.WriteLine "Anrede;Nachname;Sparte;IBAN;Werbung;..." 'Kopfzeile schreiben  
For i = 1 To UBound(Zeilen) 'erste Zeile (mit Index 0) überspringen  
    If Trim(Zeilen(i)) = "" Then 'Leerzeile oder nur Leerzeichen enthalten  
        ZeileNeu = Zeilen(i)
    Else
        Felder = Split(Replace(Replace(Zeilen(i), Delim & "Ja" & Delim, Delim & "1" & Delim), Delim & "Nein" & Delim, Delim & "0" & Delim), Delim) 'Ersetzung "Ja" und "Nein" sowie anhand des Trennzeichens <Delim> in Felder zerlegen  
        ZeileNeu = _
            Felder(40) & Delim & _
			Delim & _
            Felder(3) & Delim & _
            Felder(18) & Delim & _
            Delim & _
	    Delim & _
	    Delim & _
            Felder(4) & Delim & _
            Felder(7) & Delim & _
            Felder(6) & Delim & _
	    Felder(12) & Delim & _
	    Felder (15) & Delim & _
	    Felder (9) & Delim & _
	    Felder (13) & Delim & _
	    Felder (14) & Delim & _
	    Felder (10) & Delim & _
	    Felder (11) & Delim & _
	    Delim & _
	    Felder (20) & Delim & _
	    Felder (23) & Delim & _
	    Felder (24) & Delim & _
            ...
	    Felder (25)
    End If
    DateiNeu.WriteLine ZeileNeu
Next
Da für das Suchen von "Ja" und "Nein" jeweils auch das Trennzeichen davor und danach verwendet wird (damit nicht auch zB das "Ja" im Namen "Jagr" ersetzt würde), wird das nicht funktionieren, wenn sich das "Ja" oder "Nein" in der ersten oder letzten Spalte befindet.

Grüße
bastla

[Edit] In Zeilen 10, 11 und 13 Array-Bezeichnung auf "Zeilen" korrigiert (und kurz angetestet) [/Edit]
Mitglied: apfeltoast
apfeltoast 15.05.2015 um 13:16:00 Uhr
Goto Top
Super großen Dank an dich.
Allerdings hat das Skript mit der Benamung wohl Probleme. Wenn mich nicht alles täuscht müsste es in Zeile 10:
If Trim(Zeilen(i)) = "" Then heißen. Hier fehlt wohl ein "n" am Ende.
Allerdings findet er dann den Index im Array nicht.
Mitglied: bastla
bastla 15.05.2015 um 13:28:28 Uhr
Goto Top
Hallo apfeltoast!

Wie gesagt: völlig ungetestet ...

Ich bessere mal etwas nach.

Grüße
bastla
Mitglied: apfeltoast
apfeltoast 15.05.2015 um 13:40:43 Uhr
Goto Top
Hallo bastla,

großen Dank für deine Unterstützung. Habe es jetzt verstanden. Selbst habe ich die Zeilen 10,11 und 13 auch geändert - allerdings habe ich die Ersetzung nicht benötigt und daher den ursprünglichen Wert gelassen in Zeile:
Felder = Split(Zeile, Delim) 'anhand des Trennzeichens <Delim> in Felder zerlegen

Was mir dann letztendlich mein Array nicht sauber darstellen konnte.
Nochmal dankeschön!

Gruß Apfeltoast
Mitglied: 114757
114757 15.05.2015 aktualisiert um 13:58:40 Uhr
Goto Top
Moin,
lässt sich in Powershell auch auf eine Zeile verkürzen:
import-csv "C:\Daten.csv" -Delimiter ";" | select @{n="Anrede";e={$_.Textbox1}}, @{n="Nachname";e={$_.Textbox2}},@{n="Sparte";e={$_.DropDown1}},@{n="IBAN";e={}},@{n="Werbung";e={if($_.Checkbox1 -eq "Ja"){0}else{1}}} | Export-Csv "C:\daten_out.csv" -NoTypeInformation -Delimiter ";" -Encoding UTF8  
Nur mal so als Anreiz zum Powershell lernen face-smile

Gruß jodel32