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
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
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
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
1
2
3
4
5
2
3
4
5
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
1
2
3
4
5
2
3
4
5
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 157908
Url: https://administrator.de/forum/mit-vbs-csv-datei-filtern-157908.html
Ausgedruckt am: 12.01.2025 um 13:01 Uhr
11 Kommentare
Neuester Kommentar
Hallo Made750!
Sollte in etwa so gehen (Pfade entsprechend anpassen):
Gruß Dieter
Sollte in etwa so gehen (Pfade entsprechend anpassen):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
Hallo Made750!
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:
Ergebnis (Trennzeichen = ";"):
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 LobErst mal vielen Dank für deine Hilfe, das Script funktioniert tadellos ein grosses Lob für dich an dieser Stelle.
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
1
2
3
4
2
3
4
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
Hallo Made750!
Gruß Dieter
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: 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?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
Hallo Made750
Gruß Dieter
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ürdeVielen 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.
Du kannst gerne noch die eine oder andere Frage stellen, aber das hindert Dich nicht daran, den Beitrag schon mal auf gelöst zu setzenfalls das in Ordnung ist? (erneuter Kommentar zu diesem Thema)
Sonst markiere ich diesen Beitrag nun als gelöst.
Gruß Dieter
Hallo Made750!
Na dann, nächster Versuch:
oder
Sollten beide Versionen das gleiche Ergebnis liefern
Ansonsten denke ich, dass wir nun eigentlich alle Möglichkeiten erfasst haben
Gruß Dieter
Na dann, nächster Versuch:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
'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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'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
Ansonsten denke ich, dass wir nun eigentlich alle Möglichkeiten erfasst haben
Gruß Dieter
Hallo Made750!
Freut mich
Gruß Dieter
Freut mich
Nochmals Vielen Dank,
Yepp, gern geschehenSchönes Wochenende &
Wünsche ich Dir auchGruß Dieter