Files
UsernameNormalizer/normalize_username_bycs_gosa.py
2026-02-16 11:37:31 +00:00

77 lines
3.5 KiB
Python

import csv
def normalize_username(username):
"""
Ersetzt Umlaute und Sonderzeichen in einem Benutzernamen durch ihre ASCII-Entsprechungen.
Args:
username (str): Der zu normalisierende Benutzername.
Returns:
str: Der normalisierte Benutzername.
"""
mapping = {
'ä': 'ae', 'ö': 'oe', 'ü': 'ue', 'ß': 'ss',
'č': 'c', 'ũ': 'u', 'š': 's', 'ž': 'z', 'đ': 'd', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ś': 's', 'ź': 'z',
'ş': 's', 'ğ': 'g', 'é': 'e', 'ě': 'e'
}
normalized_username = ''
for char in username:
normalized_username += mapping.get(char, char) # Ersetze, falls vorhanden, sonst belasse Zeichen unverändert
return normalized_username
def process_csv(input_file, output_file, log_file):
"""
Liest eine CSV-Datei, normalisiert die Benutzernamen in der "Kennung"-Spalte,
erkennt Duplikate, hängt bei Bedarf eine Zahl an die Kennung an
und protokolliert alle Änderungen in einer Log-Datei.
Schreibt die Ergebnisse in eine neue CSV-Datei.
Args:
input_file (str): Der Pfad zur Eingabe-CSV-Datei.
output_file (str): Der Pfad zur Ausgabe-CSV-Datei.
log_file (str): Der Pfad zur Log-Datei.
"""
seen_usernames = {} # Dictionary, um bereits verwendete Benutzernamen zu verfolgen
with open(input_file, 'r', newline='', encoding='utf-8') as infile, \
open(output_file, 'w', newline='', encoding='utf-8') as outfile, \
open(log_file, 'w', newline='', encoding='utf-8') as logfile:
reader = csv.reader(infile, delimiter=';')
writer = csv.writer(outfile, delimiter=';')
log_writer = csv.writer(logfile, delimiter=';')
header = next(reader) # Lese die Kopfzeile
writer.writerow(header) # Schreibe die Kopfzeile in die Ausgabedatei
log_writer.writerow(['Original Kennung', 'Normalisierte Kennung']) # Schreibe Header in die Log-Datei
for row in reader:
try:
kennung = row[1] # Die "Kennung"-Spalte (Index 1)
normalized_kennung = normalize_username(kennung)
# Behandle Duplikate
original_kennung = kennung
count = seen_usernames.get(kennung, 0)
if count > 0:
normalized_kennung += str(count + 1)
log_writer.writerow([original_kennung, normalized_kennung]) # Protokolliere die Änderung
seen_usernames[kennung] = count + 1
row[1] = normalized_kennung # Ersetze die ursprüngliche Kennung durch die normalisierte
writer.writerow(row)
except IndexError:
print(f"Zeile übersprungen wegen Indexfehler: {row}") # Behandelt Zeilen mit zu wenigen Spalten
except Exception as e:
print(f"Fehler beim Verarbeiten der Zeile {row}: {e}") # Fängt andere Fehler ab
# Beispielaufruf der Funktion
input_csv_file = '2026-02-16_BYCSexport_for_gosa.csv' # Ersetze dies durch den tatsächlichen Pfad zu deiner Eingabedatei
output_csv_file = '2026_02_16_gosa.csv' # Ersetze dies durch den gewünschten Pfad für die Ausgabedatei
log_file = 'kennung_aenderungen.csv' # Pfad zur Log-Datei
process_csv(input_csv_file, output_csv_file, log_file)
print(f"Die CSV-Datei '{input_csv_file}' wurde verarbeitet. Die normalisierten Daten wurden in '{output_csv_file}' gespeichert.")
print(f"Alle Änderungen an den Kennungen wurden in '{log_file}' protokolliert.")