77 lines
3.5 KiB
Python
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.")
|
|
|