Automatisches Skript für CSV Bearbeitung
Hallo liebe Leser und Helfer,
ich bin bei meinen Versuchen gerade draufgekommen wie viel das Spaß machen kann an einem VBS Script was zu ändern usw.
Doch jetzt komme ich leider nicht mehr weiter weil es zu kompliziert wird
Ich benötige dies für eine Automatisierte Formatierung einer CSV Datei.
Kann mir da bitte jemand helfen?
Besten Dank im Vorraus
Viele Grüße
Robert
Ursprung *.csv mit mehreren Zeilen:
"APC";"APC";"012074";"854";"TEST";"12";"test";"black-green";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
Ziel ist eigene Textdatei mit folgender Formatierung:
black-green; black-gre
Zielbeschreibung in Wörtern: aus der CSV Datei soll die Spalte 8 kopiert werden und in eine neue *.txt Datei eingefügt werden.
Dazu kommt dann noch dass hier ein Semikolon folgt und danach der gleiche Wert noch ein Mal, aber beschnitten auf 8 Stellen.
Eine Version ohne der Beschneidung des gleichen Wertes wäre auch akzeptabel.
Momentaner Stand:
;;;;;;;"black-green"
verursacht durch folgendes Skript:
Erweiterung:
siehe Ziel
Hint:
"APC";"APC";"012074";"854";"TEST";"12";"test";"";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
es gibt auch Datensätze die Nullwerte enthalten, diese gehören dann nicht in die Zieldatei übernommen
[Edit Biber] Codeformatierung nachgetragen [/Edit]
ich bin bei meinen Versuchen gerade draufgekommen wie viel das Spaß machen kann an einem VBS Script was zu ändern usw.
Doch jetzt komme ich leider nicht mehr weiter weil es zu kompliziert wird
Ich benötige dies für eine Automatisierte Formatierung einer CSV Datei.
Kann mir da bitte jemand helfen?
Besten Dank im Vorraus
Viele Grüße
Robert
Ursprung *.csv mit mehreren Zeilen:
"APC";"APC";"012074";"854";"TEST";"12";"test";"black-green";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
Ziel ist eigene Textdatei mit folgender Formatierung:
black-green; black-gre
Zielbeschreibung in Wörtern: aus der CSV Datei soll die Spalte 8 kopiert werden und in eine neue *.txt Datei eingefügt werden.
Dazu kommt dann noch dass hier ein Semikolon folgt und danach der gleiche Wert noch ein Mal, aber beschnitten auf 8 Stellen.
Eine Version ohne der Beschneidung des gleichen Wertes wäre auch akzeptabel.
Momentaner Stand:
;;;;;;;"black-green"
verursacht durch folgendes Skript:
Const iPath = "quelle"
Const ePath = "Ziel"
Const Delim = ";" 'Bei Tab: Delim = vbTab
Dim Fso, iFile, eFile, iText, eText(7), i
Set Fso = CreateObject("Scripting.FileSystemObject")
Set iFile = Fso.OpenTextFile(iPath)
Set eFile = Fso.CreateTextFile(ePath)
Do Until iFile.AtEndOfStream
iText = Split(iFile.ReadLine, Delim, 9)
If UBound(iText) >= 6 Then
For i = 7 To 7: eText(i) = iText(i): Next
eFile.WriteLine Join(eText, Delim)
End If
Loop
iFile.Close: eFile.Close
MsgBox "Der Exportvorgang ist beendet!", vbInformation, "Meldung"
Erweiterung:
siehe Ziel
Hint:
"APC";"APC";"012074";"854";"TEST";"12";"test";"";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
es gibt auch Datensätze die Nullwerte enthalten, diese gehören dann nicht in die Zieldatei übernommen
[Edit Biber] Codeformatierung nachgetragen [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 172316
Url: https://administrator.de/contentid/172316
Ausgedruckt am: 26.11.2024 um 10:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo,
nachdem ich dein Problem verstanden habe hier die Lösung:
Viel Spaß damit
Thomas
nachdem ich dein Problem verstanden habe hier die Lösung:
Const iPath = "quelle"
Const ePath = "Ziel"
Const Delim = ";" 'Bei Tab: Delim = vbTab
Dim Fso, iFile, eFile, iText, eText(7), i
Set Fso = CreateObject("Scripting.FileSystemObject")
Set iFile = Fso.OpenTextFile(iPath)
Set eFile = Fso.CreateTextFile(ePath)
Do Until iFile.AtEndOfStream
iText = Split(iFile.ReadLine, Delim, 9)
If UBound(iText) >= 6 Then
if len(iText(7)) > 3 then
if len(iText(7)) <= 10 then
eFile.WriteLine mid(iText(7),2,len(iText(7))-2) & ";" & mid(iText(7),2,len(iText(7))-2)
else
eFile.WriteLine mid(iText(7),2,len(iText(7))-2) & ";" & mid(iText(7),2,8)
end if
End If
End If
Loop
iFile.Close
eFile.Close
MsgBox "Der Exportvorgang ist beendet!", vbInformation, "Meldung"
Viel Spaß damit
Thomas
Input:
liefert folgenden Output:
Ich war noch so frei und habe eine Prüfung eingebaut, damit es auch funktioniert, wenn der Text kürze als 10 Zeichen (8 text+2 ", zeile 16) ist.
Gruss
Thomas
"APC";"APC";"012074";"854";"TEST";"12";"test";"black-green";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
"APC";"APC";"012074";"854";"TEST";"12";"test";"back-bn";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
"APC";"APC";"012074";"854";"TEST";"12";"test";"green-green";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
"APC";"APC";"012074";"854";"TEST";"12";"test";"";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
"APC";"APC";"012074";"854";"TEST";"12";"test";"green-green";"no size";"keine Angabe";"keine Angabe";"";"0";"222";"444";"test";"5";
liefert folgenden Output:
black-green;black-gr
back-bn;back-bn
green-green;green-gr
green-green;green-gr
Ich war noch so frei und habe eine Prüfung eingebaut, damit es auch funktioniert, wenn der Text kürze als 10 Zeichen (8 text+2 ", zeile 16) ist.
Gruss
Thomas
Hallo Transministrator!
Etwa so:
Grüße
bastla
[Edit] Was ich auch immer so trödeln muss ... [/Edit]
Etwa so:
Const iPath = "quelle"
Const ePath = "Ziel"
Const Delim = ";" 'Bei Tab: Delim = vbTab
Set Fso = CreateObject("Scripting.FileSystemObject")
Set iFile = Fso.OpenTextFile(iPath)
Set eFile = Fso.CreateTextFile(ePath)
Do Until iFile.AtEndOfStream
iText = Split(iFile.ReadLine, Delim, 9)
If UBound(iText) >= 7 Then
eText = Replace(iText(7), """", "")
If Trim(eText) <> "" Then eFile.WriteLine eText & Delim & Left(eText, 8)
End If
Loop
eFile.Close
iFile.Close
bastla
[Edit] Was ich auch immer so trödeln muss ... [/Edit]
@onkel-ossi
... und mit
ist nicht sicher gestellt, dass es auch ein
Grüße
bastla
Ich war noch so frei und habe eine Prüfung eingebaut, damit es auch funktioniert, wenn der Text kürze als 10 Zeichen (8 text+2 ", zeile 16) ist.
Einem "Left()
" ist es egal, wie lang ein Text ist ...... und mit
If UBound(iText) >= 6 Then
iText(7)
gibt ...Grüße
bastla
Zitat von @bastla:
@onkel-ossi
> Ich war noch so frei und habe eine Prüfung eingebaut, damit es auch funktioniert, wenn der Text kürze als 10
Zeichen (8 text+2 ", zeile 16) ist.
Einem "
@onkel-ossi
> Ich war noch so frei und habe eine Prüfung eingebaut, damit es auch funktioniert, wenn der Text kürze als 10
Zeichen (8 text+2 ", zeile 16) ist.
Einem "
Left()
" ist es egal, wie lang ein Text ist ...das ist grundsätzlich richtig, aber ich nutze ja nicht
LEFT
, da die Texte mit einem " enden und dieses nicht mit übernommen werden sollte setze ich die Funktion MID
ein.... und mit
ist nicht sicher gestellt, dass es auch ein
If UBound(iText) >= 6 Then
>
iText(7)
gibt ...stimmt, hier sollte dann der Code geändert werden:
If UBound(iText) >= 7 Then
Gruss
Thomas
Hallo Tranministrator!
Groß sind die Unterschiede ja nicht (mit Ausnahme der Absicherung, falls tatsächlich ein Datensatz kein Feld 8 haben sollte -
In meiner etwas knapper formulierten Variante werden zunächst die Anführungszeichen des Feldes 8 eliminiert und dann geprüft, ob der verbleibende Teil aus mehr als Leerzeichen besteht (wenn auch Leerzeichen ok wären, müsstest Du
Grüße
bastla
Groß sind die Unterschiede ja nicht (mit Ausnahme der Absicherung, falls tatsächlich ein Datensatz kein Feld 8 haben sollte -
UBound()
liefert ja als Ergebnis den höchsten Index des Arrays, und wenn iText(7)
benötigt wird, muss dieser Index eben mindestens 7, und nicht 6 sein; das hattest allerdings Du schon verbrochen ).In meiner etwas knapper formulierten Variante werden zunächst die Anführungszeichen des Feldes 8 eliminiert und dann geprüft, ob der verbleibende Teil aus mehr als Leerzeichen besteht (wenn auch Leerzeichen ok wären, müsstest Du
Trim()
entfernen). Dann werden einfach der gesamte Feldinhalt, das Trennzeichen und die ersten maximal 8 Zeichen (sind es bereits weniger, dann eben soviele, wie noch vorhanden sind) von links in die Zieldatei geschrieben ...Grüße
bastla
@onkel-ossi
Grüße
bastla
ich nutze ja nicht
Es gibt ja auch selten nur einen Weg zum Ziel (obwohl es auch dem LEFT
Mid()
egal wäre, ob es tatsächlich 8 Stellen liefern kann) ... Grüße
bastla
Hallo Robert,
bastla entfernt mit der Funktion
Meine Version "schnippelt" den Text mit der Funktion
Beide Versionen sollten das gleiche Ergebnis liefern (wenn du in "meiner" Version noch in Zeile 14 die 6 durch eine 7 ersetzt.
Gruss
Thomas
bastla entfernt mit der Funktion
REPLACE
die "
aus deinen Texten, das ist ein eleganter Zug und macht die weitere Verarbeitung einfacher (darauf hätte ich ja auch kommen können )!Meine Version "schnippelt" den Text mit der Funktion
MID
aus den begrenzenden "
heraus.Beide Versionen sollten das gleiche Ergebnis liefern (wenn du in "meiner" Version noch in Zeile 14 die 6 durch eine 7 ersetzt.
Gruss
Thomas