Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Mit VBS CSV-Datei Filtern

Frage Entwicklung

Mitglied: Made750

Made750 (Level 1) - Jetzt verbinden

03.01.2011, aktualisiert 16:04 Uhr, 3970 Aufrufe, 11 Kommentare

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
01.
Name,Mail1,Mail2,Mail3                    //Headerinformationen 
02.
Test,Test@gugs.ch,hallo@asdf.ch,          //Hier befinden sich zwei Mails es wird die erste verwendet 
03.
Hans,,Hallo1@asdf.ch,                    //Hier ist nur die zweite Adresse befüllt also soll auch diese verwendet werden 
04.
Stefan,,,Einself@111.ch                   //Hierist nur die dritte Adresse befüllt also soll auch diese verwendet werden 
05.
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
01.
Name,Mail1            
02.
Test,Test@gugs.ch          
03.
Hans,Hallo1@asdf.ch                     
04.
Stefan,Einself@111.ch                   
05.
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
Mitglied: 76109
03.01.2011 um 17:38 Uhr
Hallo Made750!

Sollte in etwa so gehen (Pfade entsprechend anpassen):
01.
    Const CsvImportFile = "E:\Threads\$Test\Import.Csv" 
02.
    Const CsvExportFile = "E:\Threads\$Test\Export.Csv" 
03.
 
04.
    Const Delims = "," 
05.
     
06.
    Const GenMailAddress = "info%1@company.ch" 
07.
 
08.
     
09.
    Dim Fso, File, Count, Header, Text, i 
10.
 
11.
'Main Begin 
12.
  
13.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
14.
     
15.
    Set File = Fso.OpenTextFile(CsvImportFile) 
16.
     
17.
    Text = Split(File.ReadAll, vbCrLf):  File.Close 
18.
     
19.
    Count = 1 
20.
     
21.
    Header = Split(Text(0), Delims, 3) 
22.
     
23.
    Text(0) = Header(0) & Delims & Header(1) 
24.
     
25.
    For i = 1 To UBound(Text):  Text(i) = GetCsvText(Text(i)):  Next 
26.
     
27.
    Set File = Fso.CreateTextFile(CsvExportFile) 
28.
     
29.
    File.Write Join(Text, vbCrLf):  File.Close 
30.
	 
31.
'Main End 
32.
 
33.
Function GetCsvText(ByRef Text) 
34.
    Dim Token, Target(1), i 
35.
     
36.
    Token = Split(Text, Delims):  Target(0) = Token(0) 
37.
     
38.
    For i = 1 To UBound(Token) 
39.
        If Trim(Token(i)) <> "" Then Target(1) = Trim(Token(i)):  Exit For 
40.
    Next 
41.
     
42.
    If i > UBound(Token) Then 
43.
        Target(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1 
44.
    End If 
45.
     
46.
    GetCsvText = Join(Target, Delims) 
47.
End Function
Gruß Dieter
Bitte warten ..
Mitglied: Made750
05.01.2011 um 13:43 Uhr
Hallo Dieter

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

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
01.
Name,Mail1,Mail2,Mail3,Vorname,OrganizationalUnit,City,Adress 
02.
"Test","test@test.ch","","","Sepp","OUname","Bern","AStrasse,3" 
03.
"Mueller","","Hallo1@asdf.ch","","Toni","OUname","Basel","BStrasse,4" 
04.
"Meier","","","","Tony","OUname","Genf","CStrasse,5"
Beispeil Ziel CSV
01.
Name,Mail1,Vorname,OrganizationalUnit,City,Adress 
02.
"Test","test@test.ch","Sepp","OUname","Bern","Strasse,3" 
03.
"Mueller","Hallo1@asdf.ch","Toni","OUname","Basel","BStrasse,4" 
04.
"Meier","info1@company.ch","Tony","OUname","Genf","CStrasse,5"

Vielen Dank nochmals &
Freundliche Grüsse Made750
Bitte warten ..
Mitglied: 76109
05.01.2011 um 15:34 Uhr
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.
Yepp, gern geschehen und Danke für das Lob

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:
01.
Const CsvImportFile = "E:\Threads\$Test\Import.Csv" 
02.
Const CsvExportFile = "E:\Threads\$Test\Export.Csv" 
03.
 
04.
Const GenMailAddress = "info%1@company.ch" 
05.
 
06.
    Dim Fso, File, Count, Text, i 
07.
 
08.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
09.
     
10.
    Set File = Fso.OpenTextFile(CsvImportFile) 
11.
     
12.
    Text = Split(File.ReadAll, vbCrLf):  File.Close 
13.
     
14.
    Count = 1 
15.
     
16.
    Text(0) = Join(Split(Text(0), ","), ";") 
17.
     
18.
    For i = 1 To UBound(Text):  Text(i) = GetCsvText(Text(i)):  Next 
19.
     
20.
    Set File = Fso.CreateTextFile(CsvExportFile) 
21.
     
22.
    File.Write Join(Text, vbCrLf):  File.Close 
23.
 
24.
Private Function GetCsvText(ByRef CsvText) 
25.
    Dim Text, Token, i 
26.
     
27.
    Text = Replace(Replace(CsvText, ",""", ";"), """", "") 
28.
         
29.
    Token = Split(Text, ";") 
30.
         
31.
    For i = 1 To 3 
32.
            If Trim(Token(i)) <> "" Then Token(1) = Trim(Token(i)):  Exit For 
33.
    Next 
34.
     
35.
    If i > 3 Then 
36.
            Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1 
37.
    End If 
38.
     
39.
    Token(2) = "":  Token(3) = "" 
40.
         
41.
    GetCsvText = Join(Token, ";") 
42.
End Function
Ergebnis (Trennzeichen = ";"):
01.
Name;Mail1;Mail2;Mail3;Vorname;OrganizationalUnit;City;Adress 
02.
Test;test@test.ch;;;Sepp;OUname;Bern;AStrasse,3 
03.
Mueller;Hallo1@asdf.ch;;;Toni;OUname;Basel;BStrasse,4 
04.
Meier;info1@company.ch;;;Tony;OUname;Genf;CStrasse,5
Bitte warten ..
Mitglied: Made750
10.01.2011 um 10:15 Uhr
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
01.
Name,Mail1,Vorname,OrganizationalUnit,City,Adress 
02.
"Test","test@test.ch","Sepp","OUname","Bern","Strasse,3" 
03.
"Mueller","Hallo1@asdf.ch","Toni","OUname","Basel","BStrasse,4" 
04.
"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
Bitte warten ..
Mitglied: 76109
10.01.2011 um 11:48 Uhr
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:
01.
Option Explicit 
02.
 
03.
Const CsvImportFile = "E:\Threads\$Test\Import.Csv" 
04.
Const CsvExportFile = "E:\Threads\$Test\Export.Csv" 
05.
 
06.
Const GenMailAddress = "info%1@company.ch" 
07.
 
08.
Dim Fso, File, Count, Text, i 
09.
 
10.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
11.
     
12.
    Set File = Fso.OpenTextFile(CsvImportFile) 
13.
     
14.
    Text = Split(File.ReadAll, vbCrLf):  File.Close 
15.
     
16.
    Count = 1 
17.
     
18.
    For i = 1 To UBound(Text):  Text(i) = GetCsvText(Text(i)):  Next 
19.
     
20.
    Set File = Fso.CreateTextFile(CsvExportFile) 
21.
     
22.
    File.Write Join(Text, vbCrLf):  File.Close 
23.
 
24.
Private Function GetCsvText(ByRef CsvText) 
25.
    Dim Text, Token, i 
26.
     
27.
    Text = Replace(Replace(CsvText, ",""", ";"), """", "") 
28.
     
29.
    Token = Split(Text, ";") 
30.
         
31.
    For i = 1 To 3 
32.
        If Trim(Token(i)) <> "" Then Token(1) = Trim(Token(i)):  Exit For 
33.
    Next 
34.
     
35.
    If i > 3 Then 
36.
        Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1 
37.
    End If 
38.
     
39.
    Token(2) = "":  Token(3) = "" 
40.
     
41.
    For i = 0 To UBound(Token) 
42.
        Token(i) = Chr(34) & Token(i) & Chr(34) 
43.
    Next 
44.
         
45.
    GetCsvText = Join(Token, ",") 
46.
End Function
Gruß Dieter
Bitte warten ..
Mitglied: Made750
10.01.2011 um 12:30 Uhr
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
Bitte warten ..
Mitglied: 76109
10.01.2011 um 13:13 Uhr
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ürde
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 setzen

Gruß Dieter
Bitte warten ..
Mitglied: Made750
11.01.2011 um 14:01 Uhr
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
01.
Name,Mail1,Mail2,Mail3,Vorname,OrganizationalUnit,City,Adress 
02.
"Test","test@test.ch","","","Sepp","OUname","Bern","AStrasse,3" 
03.
"Mueller","","Hallo1@asdf.ch","Test@Test.ch","Toni","OUname","Basel","BStrasse,4" 
04.
"Meier","","","","Tony","OUname","Genf","CStrasse,5" 
05.
"Asdf","jonas@jonas.ch","","toni@toni.ch","Tony","OUname","Genf","CStrasse,5"
Beispiel Ziel CSV
01.
Name,Mail1,Mail2,Mail3,Vorname,OrganizationalUnit,City,Adress 
02.
"Test","test@test.ch","","","Sepp","OUname","Bern","AStrasse,3" 
03.
"Mueller","Hallo1@asdf.ch","Test@Test.ch","","Toni","OUname","Basel","BStrasse,4" 
04.
"Meier","dummy1@company.ch","","","Tony","OUname","Genf","CStrasse,5" 
05.
"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
Bitte warten ..
Mitglied: 76109
11.01.2011 um 15:53 Uhr
Hallo Made750!

Na dann, nächster Versuch:
01.
'Snip.......................................................................................................... 
02.
 
03.
Private Function GetCsvText(ByRef CsvText) 
04.
    Dim Text, Token, i 
05.
     
06.
    Text = Replace(Replace(CsvText, ",""", ";"), """", "") 
07.
     
08.
    Token = Split(Text, ";") 
09.
         
10.
    If Trim(Token(1)) = "" Then 
11.
        If Trim(Token(2)) <> "" Then 
12.
            Token(1) = Trim(Token(2)):  Token(2) = Trim(Token(3)):  Token(3) = "" 
13.
        ElseIf Trim(Token(3)) <> "" Then 
14.
            Token(1) = Trim(Token(3)):  Token(2) = "": Token(3) = "" 
15.
        Else 
16.
            Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1 
17.
        End If 
18.
    End If 
19.
     
20.
    If Trim(Token(2)) = "" Then Token(2) = Trim(Token(3)):  Token(3) = "" 
21.
     
22.
    For i = 0 To UBound(Token) 
23.
        Token(i) = Chr(34) & Token(i) & Chr(34) 
24.
    Next 
25.
     
26.
    GetCsvText = Join(Token, ",") 
27.
End Function
oder
01.
'Snip.......................................................................................................... 
02.
 
03.
Private Function GetCsvText(ByRef CsvText) 
04.
    Dim Text, Token, i 
05.
     
06.
    Text = Replace(Replace(CsvText, ",""", ";"), """", "") 
07.
     
08.
    Token = Split(Text, ";") 
09.
         
10.
    If Token(1) & Token(2) & Token(3) = "" Then 
11.
        Token(1) = Replace(GenMailAddress, "%1", Count):  Count = Count + 1 
12.
    Else 
13.
        For i = 2 To 3 
14.
            If Trim(Token(1)) = "" Then Token(1) = Trim(Token(i)):  Token(i) = "" 
15.
        Next 
16.
        If Trim(Token(2)) = "" Then Token(2) = Trim(Token(3)):  Token(3) = "" 
17.
    End If 
18.
     
19.
    For i = 0 To UBound(Token) 
20.
        Token(i) = Chr(34) & Token(i) & Chr(34) 
21.
    Next 
22.
    
23.
    GetCsvText = Join(Token, ",") 
24.
End Function
Sollten beide Versionen das gleiche Ergebnis liefern

Ansonsten denke ich, dass wir nun eigentlich alle Möglichkeiten erfasst haben

Gruß Dieter
Bitte warten ..
Mitglied: Made750
14.01.2011 um 08:37 Uhr
Hallo Dieter

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

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

Zitat von Made750:
Vielen Dank für deine Hilfe, hat alles funktioniert wie gewollt.
Freut mich
Nochmals Vielen Dank,
Yepp, gern geschehen
Schönes Wochenende &
Wünsche ich Dir auch

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
VB for Applications
Bestimmte Daten aus eine CSV-Datei in eine Excel-Tabelle importieren (2)

Frage von MariaElena zum Thema VB for Applications ...

Batch & Shell
gelöst PS Werte CSV-Datei in AD Attribut (3)

Frage von lupolo zum Thema Batch & Shell ...

Batch & Shell
Mehrere AD Benutzer aus CSV Datei mit PowerShell erstellen (1)

Frage von windelterrorist zum Thema Batch & Shell ...

Batch & Shell
CSV-Datei nach Excel importieren (5)

Frage von mrvfbnummer2 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...