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.")