tranministrator
Goto Top

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 face-sad
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 face-smile

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]

Content-ID: 172316

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

Ausgedruckt am: 26.11.2024 um 10:11 Uhr

onkel-ossi
onkel-ossi 31.08.2011 um 01:07:01 Uhr
Goto Top
Hallo,

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
onkel-ossi
onkel-ossi 31.08.2011 um 01:10:10 Uhr
Goto Top
Input:

"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
bastla
bastla 31.08.2011 um 01:12:17 Uhr
Goto Top
Hallo Transministrator!

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
Grüße
bastla

[Edit] Was ich auch immer so trödeln muss ... face-wink [/Edit]
bastla
bastla 31.08.2011 um 01:15:05 Uhr
Goto Top
@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 ...

... und mit
 If UBound(iText) >= 6 Then
ist nicht sicher gestellt, dass es auch ein iText(7) gibt ...

Grüße
bastla
Tranministrator
Tranministrator 31.08.2011 um 01:19:05 Uhr
Goto Top
Hallo Thomas,

das schaut ja wunderbar aus, perfekter gehts nicht face-smile
Super Arbeit geleistet face-smile

Ich danke dir recht herzlich face-smile

Viele Grüsse

Robert
Tranministrator
Tranministrator 31.08.2011 um 01:27:03 Uhr
Goto Top
Hey bastla,

ich hab jetzt mal deine Version hergenommen, verstehe aber den Unterschied noch nicht so ganz zum Thomas seinem Script.
Hast du da eine kurze Erklärung für mich?

Danke

Viele Grüße

Robert
onkel-ossi
onkel-ossi 31.08.2011 um 01:31:21 Uhr
Goto Top
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 "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
 If UBound(iText) >= 6 Then
> 
ist nicht sicher gestellt, dass es auch ein iText(7) gibt ...

stimmt, hier sollte dann der Code geändert werden:

If UBound(iText) >= 7 Then

Gruss
Thomas
Tranministrator
Tranministrator 31.08.2011 um 01:32:03 Uhr
Goto Top
Hey Bastla,

besten dank dir auch für dein tolles Skript, das ist erste Sahne face-smile

Viele Grüße

Robert
bastla
bastla 31.08.2011 um 01:35:12 Uhr
Goto Top
Hallo Tranministrator!

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 face-wink).

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
bastla
bastla 31.08.2011 um 01:36:55 Uhr
Goto Top
@onkel-ossi
ich nutze ja nicht LEFT
Es gibt ja auch selten nur einen Weg zum Ziel (obwohl es auch dem Mid() egal wäre, ob es tatsächlich 8 Stellen liefern kann) ... face-smile

Grüße
bastla
onkel-ossi
onkel-ossi 31.08.2011 um 01:37:01 Uhr
Goto Top
Hallo Robert,

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 face-wink)!
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
Tranministrator
Tranministrator 31.08.2011 um 06:40:03 Uhr
Goto Top
Hallo Ihr Zwei face-smile

Ja das war mein Fehler, bin da leider noch nicht so versiert wie ich gerne wäre.
Noch einmal ein Hoch auf euch beide, vielen Dank für die Bereitstellung face-smile

Viele Grüße

Robert