Username generieren . ab in eine csv
Schönen Nachmittag
Ich möchte für alle User einen (neuen) Username automatisiert erstellen, am besten in eine csv. Allerdings darf da eben keiner doppelt sein und der Name muß nach gewissen Richtlinien geformt sein.
- die ersten beiden Stellen ergeben sich aus der Jahreszahl
- dann kommen 4 (zufällige) Buchstaben
Somit können pro Jahr knappe 500.000 Kennungen generiert werden und erst in 100 Jahren könnte es theoretisch passieren, daß eine doppelt sein könnte ..... mia wuascht
Wie könnte ich dies am besten angehen, wenn die "üblichen" Werte (Vor-, Zuname, Wohnort, Geburtsdatum etc) in der csv bereits enthalten sind?
Verweise auf Webseiten die dies beschreiben sind auch willkommen
vielleicht habts Ihr bessere Suchbegriffe als ich
Ich möchte für alle User einen (neuen) Username automatisiert erstellen, am besten in eine csv. Allerdings darf da eben keiner doppelt sein und der Name muß nach gewissen Richtlinien geformt sein.
- die ersten beiden Stellen ergeben sich aus der Jahreszahl
- dann kommen 4 (zufällige) Buchstaben
Somit können pro Jahr knappe 500.000 Kennungen generiert werden und erst in 100 Jahren könnte es theoretisch passieren, daß eine doppelt sein könnte ..... mia wuascht
Wie könnte ich dies am besten angehen, wenn die "üblichen" Werte (Vor-, Zuname, Wohnort, Geburtsdatum etc) in der csv bereits enthalten sind?
Verweise auf Webseiten die dies beschreiben sind auch willkommen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 331397
Url: https://administrator.de/forum/username-generieren-ab-in-eine-csv-331397.html
Ausgedruckt am: 09.04.2025 um 21:04 Uhr
16 Kommentare
Neuester Kommentar
Hallo @Franz-Josef-II,
das lässt seich sehr schön mit Powershell aber auch jeder anderen Scrip- und Programmiersprache erledigen.
Das folgende Skript importiert deine CSV-Datei, fügt dieser einen neue Spalte ('Username') hinzu und generiert für alle Zeilen der CSV einen neuen Usernamen unter Beachtung auf doppelte Namen.
Hier mal ein einfaches Beispiel mit Powershell nach deinem Schema:
(jede Zeile für dein Verständnis kommentiert)
Falls dich das 
Viel Spaß damit
Grüße Uwe
das lässt seich sehr schön mit Powershell aber auch jeder anderen Scrip- und Programmiersprache erledigen.
Das folgende Skript importiert deine CSV-Datei, fügt dieser einen neue Spalte ('Username') hinzu und generiert für alle Zeilen der CSV einen neuen Usernamen unter Beachtung auf doppelte Namen.
Hier mal ein einfaches Beispiel mit Powershell nach deinem Schema:
(jede Zeile für dein Verständnis kommentiert)
# Pfad zur CSV-Datei
$quelle = 'C:\users.csv'
# CSV Datei importieren (Delimiter anpassen)
$csv = Import-CSV $quelle -delimiter ";"
# PS 3.0 erforderlich
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# Spalte 'Username' hinzufügen
$csv | Add-Member -MemberType NoteProperty -Name 'Username' -Value ''
# Funktionsscriptblock zum generieren nach dem Schema YYYY[A-Z]{4}
$generatename = {"$((get-date).Year)$(((65..90| %{[char]$_}) | Get-Random -Count 4) -join '')"}
# Jede Zeile der CSV durchlaufen, neuen Usernamen generieren und der Spalte 'Username' zuweisen
$csv | %{
# Neuen Namen generieren
$newname = . $generatename
# sollte der Name bereits in der CSV vorhanden sein generiere so lange einen neuen bis er frei ist
while($newname -in $csv.Username){$newname = . $generatename}
# Name der Spalte zuweisen
$_.Username = $newname
}
# Neue CSV wieder exportieren
$csv | export-csv $quelle -Delimiter ";" -NoType -Encoding UTF8
65..90| %{[char]$_
} irritiert, das erspart mir hier einfach nur das Alphabet hinzutippeln Viel Spaß damit
Grüße Uwe
Zitat von @Franz-Josef-II:
In der Zeile 2:
$quelle = 'C:\users.csv''
Ist ein ' zuviel, es darf dort nur ein einfaches Hochkomma sein.
Sorry Tippfühler In der Zeile 2:
$quelle = 'C:\users.csv''
Ist ein ' zuviel, es darf dort nur ein einfaches Hochkomma sein.
In Zeile 17:
while($newname - in $csv.Username){$newname = . $generatename}
schmeißt er mir folgende Fehlermeldung raus:
Sie müssen auf der rechten Seite des Operators "-" einen Wertausdruck angeben.
Bei C:\.....\Desktop\users.ps1:17 Zeichen:21
+ while($newname - <<<< in $csv.Username){$newname = . $generatename}
+ CategoryInfo : ParserError: (
, ParseException
+ FullyQualifiedErrorId : ExpectedValueExpression
Da blicke ich (noch) nicht durch was da nicht läuft.
Du hast nicht mind. PS 3.0 while($newname - in $csv.Username){$newname = . $generatename}
schmeißt er mir folgende Fehlermeldung raus:
Sie müssen auf der rechten Seite des Operators "-" einen Wertausdruck angeben.
Bei C:\.....\Desktop\users.ps1:17 Zeichen:21
+ while($newname - <<<< in $csv.Username){$newname = . $generatename}
+ CategoryInfo : ParserError: (
+ FullyQualifiedErrorId : ExpectedValueExpression
Da blicke ich (noch) nicht durch was da nicht läuft.
Du kannst stattdessen aber auch die contains() Funktion benutzen wenn du willst, geht beides einwandfrei
while($csv.Username.contains($newname)){$newname = . $generatename}
Wie, ich hab was gewonnen? Geil, sind wir hier bei Der Preis ist Heiß? 
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
p.s. Preise bitte gerne immer hier abladen
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
p.s. Preise bitte gerne immer hier abladen
Zitat von @Franz-Josef-II:
Wie kann ich eine Prüfung einbauen, ob für den User bereits eine Kennung gibt,
Wo gibt? In der CSV oder im AD?Wie kann ich eine Prüfung einbauen, ob für den User bereits eine Kennung gibt,
wenn ja überspringe es. Z.Zt wird immer eine neue Kennung generiert. Die "Alten" sollen ja ihre jeweilige Kennung behalten.
Mach einfach eine IF-Abfrage in der Schleife und schon hast du was du willstif ($_.Username -eq ""){
# generiere hier den neuen Usernamen (bestehender Code siehe oben)
}
Keine Ursache.
Allerdings gehört dann diese Zeile:
entsorgt, weil es sonst zu einer Fehlermeldung (Kann nicht hinzugefügt werden, weil es bereits existiert) kommt.
Korrket, wenn sie schon existiert logisch.
Allerdings muß ich dann, wenn ich Zeilen hinzufüge, auch den letzten Delimiter setzen, weil er sonst (in dieser Zeile) nichts tut.
Nein musst du nicht!!

Man fügt einen User mit einem Custom Object zum $csv Array hinzu dann musst du nicht irgendeinen Delimiter hinzubasteln, das ist völliger Quatsch, Sorry.
Beispiel
usw. Denk immer daran, Powershell arbeitet Objektorientiert! Man bastelt also nicht irgend einen String an ein Object 
Allerdings gehört dann diese Zeile:
# Spalte 'Username' hinzufügen
> $csv | Add-Member -MemberType NoteProperty -Name 'Username' -Value ''
entsorgt, weil es sonst zu einer Fehlermeldung (Kann nicht hinzugefügt werden, weil es bereits existiert) kommt.
Allerdings muß ich dann, wenn ich Zeilen hinzufüge, auch den letzten Delimiter setzen, weil er sonst (in dieser Zeile) nichts tut.
Also:
1) users.csv erstellen
2) Script drüberlaufen lassen
3) Verwenden ... werkeln ....
4) Neue User kommen dazu, z.B. über eine csv
5) in der neuen csv (automatisiert
) den letzten Delimiter setzen
6) Dateien zusammenführen
7) -> 2)
8) -> 3)
etc
Falsch 1) users.csv erstellen
2) Script drüberlaufen lassen
3) Verwenden ... werkeln ....
4) Neue User kommen dazu, z.B. über eine csv
5) in der neuen csv (automatisiert
6) Dateien zusammenführen
7) -> 2)
8) -> 3)
etc
Man fügt einen User mit einem Custom Object zum $csv Array hinzu dann musst du nicht irgendeinen Delimiter hinzubasteln, das ist völliger Quatsch, Sorry.
Beispiel
$csv += [pscustomobject] @{Vorname="Max";Nachname="Muster"}
Wenn da ein Leerzeichen in der Spalte steht wär das für mich kein Wunder, ist das der Fall entweder das auch entfernen oder in der If-Prüfung zusätzlich trimmen um die Leerzeichen zu entfernen.
.
Sonniges Wochenende
Grüße Uwe
if ($_.Username.Trim() -eq ""){
}
Na, wenigstens habe ich eine Wochenendbeschäftigung, durchdenken und nachvollziehen Da glaubt man, man hat es und .... wieder nix
Wenn man nichts mehr dazu lernt ist man tot Sonniges Wochenende
Grüße Uwe
Nana, wer wird mich denn da falsch zitieren ... "Fake News Alarm"! 