diff --git a/normalize_username_bycs_gosa.py b/normalize_username_bycs_gosa.py new file mode 100644 index 0000000..3fe8f23 --- /dev/null +++ b/normalize_username_bycs_gosa.py @@ -0,0 +1,76 @@ +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.") +