made750
Goto Top

Mit VBS CSV-Datei Filtern

Hallo Liebe Administrator.de Gemeinde
Ich arbeite als Informatik Lehrling bei einer externen Informatik Bude in der Schweiz

Mein Frage bezieht sich auf VBScript in Verbindung mit CSV-Datei, deren Daten gefiltert und in eine neue CSV-Datei geschrieben werden sollen.

Ich habe eine kommagetrennte CSV-Datei, in der sich aus dem AD exportierte Benutzer befinden. Pro Benutzer-Record sind meist drei Emailadressen vorhanden. Das Endprodukt soll eine zweite CSV-Datei sein in der wieder die Benutzer stehen aber mit nur einer Emailadresse.


Beispiel Quell CSV
Name,Mail1,Mail2,Mail3                    //Headerinformationen
Test,Test@gugs.ch,hallo@asdf.ch,          //Hier befinden sich zwei Mails es wird die erste verwendet
Hans,,Hallo1@asdf.ch,                    //Hier ist nur die zweite Adresse befüllt also soll auch diese verwendet werden
Stefan,,,Einself@111.ch                   //Hierist nur die dritte Adresse befüllt also soll auch diese verwendet werden
Sepp,,,                                   //Hier ist garkeine Adresse vorhanden, es soll eine generiert werden (z.B. info%i@company.ch wobei %i hochgezählt wird)

Wichtig
Ich benötige nun ein VBScript das mir die folgendes Abfragt und dann die relevanten Daten in die Ziel-CSV-Datei schreibt:
Das Feld Name kann einfach übernommen werden
Wenn im Feld Mail1 keine Adresse vohanden ist gehe zu Mail2 sonst verwende Mail1 als Adresse.
Wenn im Feld Mail2 keine Adresse vohanden ist gehe zu Mail3 sonst verwende Mail2 als Adresse.
Wenn im Feld Mail3 keine Adresse vohanden ist dann generiere mit eine einzigartige Mailadresse (mit for-Schlaufe) sonst verwende Mail3 als Adresse.


Beispiel Ziel CSV
Name,Mail1           
Test,Test@gugs.ch         
Hans,Hallo1@asdf.ch                    
Stefan,Einself@111.ch                  
Sepp,info1@company.ch

Ich habe nur wenig Erfahrung mit coden, deshalb wende ich mich an euch.
Ich würde mich sehr freuen wenn Ihr mir helfen könnt.

Vielen Dank &
Freundliche Grüsse Made750

Content-Key: 157908

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

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: 76109
76109 03.01.2011 um 17:38:30 Uhr
Goto Top
Hallo Made750!

Sollte in etwa so gehen (Pfade entsprechend anpassen):
    Const CsvImportFile = "E:\Threads\$Test\Import.Csv"  
    Const CsvExportFile = "E:\Threads\$Test\Export.Csv"  

    Const Delims = ","  
    
    Const GenMailAddress = "info%1@company.ch"  

    
    Dim Fso, File, Count, Header, Text, i

'Main Begin  
 
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Set File = Fso.OpenTextFile(CsvImportFile)
    
    Text = Split(File.ReadAll, vbCrLf):  File.Close
    
    Count = 1
    
    Header = Split(Text(0), Delims, 3)
    
    Text(0) = Header(0) & Delims & Header(1)
    
    For i = 1 To UBound(Text):  Text(i) = GetCsvText(Text(i)):  Next
    
    Set File = Fso.CreateTextFile(CsvExportFile)
    
    File.Write Join(Text, vbCrLf):  File.Close
	
'Main End  

Function GetCsvText(ByRef Text)
    Dim Token, Target(1), i
    
    Token = Split(Text, Delims):  Target(0) = Token(0)
    
    For i = 1 To UBound(Token)
        If Trim(Token(i)) <> "" Then Target(1) = Trim(Token(i)):  Exit For  
    Next
    
    If i > UBound(Token) Then
        Target(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1  
    End If
    
    GetCsvText = Join(Target, Delims)
End Function

Gruß Dieter
Mitglied: Made750
Made750 05.01.2011 um 13:43:05 Uhr
Goto Top
Hallo Dieter

Erst mal vielen Dank für deine Hilfe, das Script funktioniert tadellos ein grosses Lob für dich an dieser Stelle. face-wink

Nun habe ich noch einige weitere Fragen
  • Ich habe nachfolgend noch mehr Spalten in der Quelldatei, wie setze ich die Anzahl Spalten damit die Werte nach Mail3 einfach übernommen werden und die Filterung der Mails doch noch statt findet?
    • wo wird die Anzahl Spalten angegeben, somit ich noch mehr statische Daten (Daten die nach Mail kommen und nicht gefiltern werden müssen) nachfolgend hinzufügen kann wie z.B. Postalcode?
  • Werte können Kommas beinhalten und daruch ist jeder Wert bereits in der Quelldatei
in Anführungszeichen gestellt im Beispiel "Strasse,3"

Beispiel Quell CSV
Name,Mail1,Mail2,Mail3,Vorname,OrganizationalUnit,City,Adress
"Test","test@test.ch","","","Sepp","OUname","Bern","AStrasse,3"  
"Mueller","","Hallo1@asdf.ch","","Toni","OUname","Basel","BStrasse,4"  
"Meier","","","","Tony","OUname","Genf","CStrasse,5"  

Beispeil Ziel CSV
Name,Mail1,Vorname,OrganizationalUnit,City,Adress
"Test","test@test.ch","Sepp","OUname","Bern","Strasse,3"  
"Mueller","Hallo1@asdf.ch","Toni","OUname","Basel","BStrasse,4"  
"Meier","info1@company.ch","Tony","OUname","Genf","CStrasse,5"  


Vielen Dank nochmals &
Freundliche Grüsse Made750
Mitglied: 76109
76109 05.01.2011 um 15:34:42 Uhr
Goto Top
Hallo Made750!

Zitat von @Made750:
Erst mal vielen Dank für deine Hilfe, das Script funktioniert tadellos ein grosses Lob für dich an dieser Stelle. face-wink
Yepp, gern geschehen und Danke für das Lobface-smile

Dein neues Beispiel umzusetzen ist kein großes Problem, allerdings frage ich mich, ob es Dir nicht möglich ist, gleich eine Csv-Datei zu erzeugen mit ";" oder Tab als Trennzeichen und nach Möglichkeit auch ohne "" ? Das würde es wesentlich einfacher machen!

Gruß Dieter

PS.
Hier mal der Code für das letzte Beispiel:
Const CsvImportFile = "E:\Threads\$Test\Import.Csv"  
Const CsvExportFile = "E:\Threads\$Test\Export.Csv"  

Const GenMailAddress = "info%1@company.ch"  

    Dim Fso, File, Count, Text, i

    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Set File = Fso.OpenTextFile(CsvImportFile)
    
    Text = Split(File.ReadAll, vbCrLf):  File.Close
    
    Count = 1
    
    Text(0) = Join(Split(Text(0), ","), ";")  
    
    For i = 1 To UBound(Text):  Text(i) = GetCsvText(Text(i)):  Next
    
    Set File = Fso.CreateTextFile(CsvExportFile)
    
    File.Write Join(Text, vbCrLf):  File.Close

Private Function GetCsvText(ByRef CsvText)
    Dim Text, Token, i
    
    Text = Replace(Replace(CsvText, ",""", ";"), """", "")  
        
    Token = Split(Text, ";")  
        
    For i = 1 To 3
            If Trim(Token(i)) <> "" Then Token(1) = Trim(Token(i)):  Exit For  
    Next
    
    If i > 3 Then
            Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1  
    End If
    
    Token(2) = "":  Token(3) = ""  
        
    GetCsvText = Join(Token, ";")  
End Function
Ergebnis (Trennzeichen = ";"):
Name;Mail1;Mail2;Mail3;Vorname;OrganizationalUnit;City;Adress
Test;test@test.ch;;;Sepp;OUname;Bern;AStrasse,3
Mueller;Hallo1@asdf.ch;;;Toni;OUname;Basel;BStrasse,4
Meier;info1@company.ch;;;Tony;OUname;Genf;CStrasse,5
Mitglied: Made750
Made750 10.01.2011 um 10:15:30 Uhr
Goto Top
Hallo Dieter

Vielen Dank nochmals für deine Hilfe.

Dein neues Beispiel umzusetzen ist kein großes Problem, allerdings frage ich mich, ob es Dir nicht möglich ist, gleich eine Csv-Datei zu erzeugen mit ";"
oder Tab als Trennzeichen und nach Möglichkeit auch ohne "" ? Das würde es wesentlich einfacher machen!

Leider muss meine Ziel Datei (Export.csv) mit Kommas getrennt sein da der nächste Import nur mit Kommas funktioniert. Deshalb müssen auch die "" dabei sein. Ich hoffe das ist realisierbar?
Hier nochmals die Ziel CSV:

Beispiel Ziel CSV
Name,Mail1,Vorname,OrganizationalUnit,City,Adress
"Test","test@test.ch","Sepp","OUname","Bern","Strasse,3"  
"Mueller","Hallo1@asdf.ch","Toni","OUname","Basel","BStrasse,4"  
"Meier","info1@company.ch","Tony","OUname","Genf","CStrasse,5"  

Die Spalten Mail2 und Mail3 müssen nicht unbedingt gelöschten werden.

Vielen Dank nochmals &
Freundliche Grüsse Made750
Mitglied: 76109
76109 10.01.2011 um 11:48:07 Uhr
Goto Top
Hallo Made750!
Zitat von @Made750:
Leider muss meine Ziel Datei (Export.csv) mit Kommas getrennt sein da der nächste Import nur mit Kommas funktioniert. Deshalb
müssen auch die "" dabei sein. Ich hoffe das ist realisierbar?
Na dann, so: face-wink
Option Explicit

Const CsvImportFile = "E:\Threads\$Test\Import.Csv"  
Const CsvExportFile = "E:\Threads\$Test\Export.Csv"  

Const GenMailAddress = "info%1@company.ch"  

Dim Fso, File, Count, Text, i

    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Set File = Fso.OpenTextFile(CsvImportFile)
    
    Text = Split(File.ReadAll, vbCrLf):  File.Close
    
    Count = 1
    
    For i = 1 To UBound(Text):  Text(i) = GetCsvText(Text(i)):  Next
    
    Set File = Fso.CreateTextFile(CsvExportFile)
    
    File.Write Join(Text, vbCrLf):  File.Close

Private Function GetCsvText(ByRef CsvText)
    Dim Text, Token, i
    
    Text = Replace(Replace(CsvText, ",""", ";"), """", "")  
    
    Token = Split(Text, ";")  
        
    For i = 1 To 3
        If Trim(Token(i)) <> "" Then Token(1) = Trim(Token(i)):  Exit For  
    Next
    
    If i > 3 Then
        Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1  
    End If
    
    Token(2) = "":  Token(3) = ""  
    
    For i = 0 To UBound(Token)
        Token(i) = Chr(34) & Token(i) & Chr(34)
    Next
        
    GetCsvText = Join(Token, ",")  
End Function

Gruß Dieter
Mitglied: Made750
Made750 10.01.2011 um 12:30:10 Uhr
Goto Top
Hallo Dieter

Vielen Dank für die schnelle Antwort und die super Lösung, Ich kann sogar noch mehr Spalten anfügen und sie werden einfach bernommen, ohne Fehlermeldung perfekt, du bist wirklich ein VBS Profi, Vielen Dank!

Ich werde das Script nun in meinem Gebilde verwenden, vieleicht werde ich mich nochmals and dich wenden falls ich eine Frage habe, falls das in Ordnung ist? (erneuter Kommentar zu diesem Thema)
Sonst markiere ich diesen Beitrag nun als gelöst.


Freundliche Grüsse
und ich hoffe ich kann dir auch vieleicht mal weiter helfen
Made750
Mitglied: 76109
76109 10.01.2011 um 13:13:30 Uhr
Goto Top
Hallo Made750

Zitat von @Made750:
Vielen Dank für die schnelle Antwort und die super Lösung, Ich kann sogar noch mehr Spalten anfügen und sie werden
einfach bernommen, ohne Fehlermeldung perfekt, du bist wirklich ein VBS Profi, Vielen Dank!
Yepp, gern geschehen und ein bisschen mitgedacht habe ich schon, wenn ich mich auch nicht als Profi bezeichnen würdeface-wink
Ich werde das Script nun in meinem Gebilde verwenden, vieleicht werde ich mich nochmals and dich wenden falls ich eine Frage habe,
falls das in Ordnung ist? (erneuter Kommentar zu diesem Thema)
Sonst markiere ich diesen Beitrag nun als gelöst.
Du kannst gerne noch die eine oder andere Frage stellen, aber das hindert Dich nicht daran, den Beitrag schon mal auf gelöst zu setzenface-wink

Gruß Dieter
Mitglied: Made750
Made750 11.01.2011 um 14:01:08 Uhr
Goto Top
Hallo Dieter

Es funktioniert alles perfekt jedoch ist bei mir selbst ein Fehler in der Überlegung passiert.
Die nachfolgenden Email Adressen wurden bisher einfach gelöscht, das ist flasch, sie sollten unter Mail2 und Mail3 noch vohanden sein wenn zwei oder drei EMail Adressen eingetragen sind. Sonst bleibt alles beim Alten.

Beispiel Quell CSV
Name,Mail1,Mail2,Mail3,Vorname,OrganizationalUnit,City,Adress
"Test","test@test.ch","","","Sepp","OUname","Bern","AStrasse,3"  
"Mueller","","Hallo1@asdf.ch","Test@Test.ch","Toni","OUname","Basel","BStrasse,4"  
"Meier","","","","Tony","OUname","Genf","CStrasse,5"  
"Asdf","jonas@jonas.ch","","toni@toni.ch","Tony","OUname","Genf","CStrasse,5"  

Beispiel Ziel CSV
Name,Mail1,Mail2,Mail3,Vorname,OrganizationalUnit,City,Adress
"Test","test@test.ch","","","Sepp","OUname","Bern","AStrasse,3"  
"Mueller","Hallo1@asdf.ch","Test@Test.ch","","Toni","OUname","Basel","BStrasse,4"  
"Meier","dummy1@company.ch","","","Tony","OUname","Genf","CStrasse,5"  
"Asdf","jonas@jonas.ch","toni@toni.ch","","Tony","OUname","Genf","CStrasse,5"  

Leider habe ich das erst jetzt gemerkt, ich hoffe dass es nicht alzu schwierig ist es zu realisieren.
Vielen Dank im Vorraus

Freundliche Grüsse
Made750
Mitglied: 76109
76109 11.01.2011 um 15:53:37 Uhr
Goto Top
Hallo Made750!

Na dann, nächster Versuch:
'Snip..........................................................................................................  

Private Function GetCsvText(ByRef CsvText)
    Dim Text, Token, i
    
    Text = Replace(Replace(CsvText, ",""", ";"), """", "")  
    
    Token = Split(Text, ";")  
        
    If Trim(Token(1)) = "" Then  
        If Trim(Token(2)) <> "" Then  
            Token(1) = Trim(Token(2)):  Token(2) = Trim(Token(3)):  Token(3) = ""  
        ElseIf Trim(Token(3)) <> "" Then  
            Token(1) = Trim(Token(3)):  Token(2) = "": Token(3) = ""  
        Else
            Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1  
        End If
    End If
    
    If Trim(Token(2)) = "" Then Token(2) = Trim(Token(3)):  Token(3) = ""  
    
    For i = 0 To UBound(Token)
        Token(i) = Chr(34) & Token(i) & Chr(34)
    Next
    
    GetCsvText = Join(Token, ",")  
End Function
oder
'Snip..........................................................................................................  

Private Function GetCsvText(ByRef CsvText)
    Dim Text, Token, i
    
    Text = Replace(Replace(CsvText, ",""", ";"), """", "")  
    
    Token = Split(Text, ";")  
        
    If Token(1) & Token(2) & Token(3) = "" Then  
        Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1  
    Else
        For i = 2 To 3
            If Trim(Token(1)) = "" Then Token(1) = Trim(Token(i)):  Token(i) = ""  
        Next
        If Trim(Token(2)) = "" Then Token(2) = Trim(Token(3)):  Token(3) = ""  
    End If
    
    For i = 0 To UBound(Token)
        Token(i) = Chr(34) & Token(i) & Chr(34)
    Next
   
    GetCsvText = Join(Token, ",")  
End Function
Sollten beide Versionen das gleiche Ergebnis liefernface-wink

Ansonsten denke ich, dass wir nun eigentlich alle Möglichkeiten erfasst habenface-smile

Gruß Dieter
Mitglied: Made750
Made750 14.01.2011 um 08:37:24 Uhr
Goto Top
Hallo Dieter

Vielen Dank für deine Hilfe, hat alles funktioniert wie gewollt. face-smile

Nochmals Vielen Dank,
Schönes Wochenende &
Freundliche Grüsse
Made750
Mitglied: 76109
76109 14.01.2011 um 11:24:55 Uhr
Goto Top
Hallo Made750!

Zitat von @Made750:
Vielen Dank für deine Hilfe, hat alles funktioniert wie gewollt. face-smile
Freut michface-smile
Nochmals Vielen Dank,
Yepp, gern geschehenface-wink
Schönes Wochenende &
Wünsche ich Dir auch

Gruß Dieter