diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 8ee506aa7..8a46c76dd 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -109,23 +109,47 @@ PATTERNS_FILE_TXT = "technician_patterns.txt" # Alt (Optional beibehalten) PATTERNS_FILE_JSON = "technician_patterns.json" # Neu (Empfohlen) def load_branch_mapping(file_path='Branchen.csv'): - # Hole eine Referenz zum Logger direkt in der Funktion - logger = logging.getLogger(__name__) + """ + Lädt das Mapping von Detail-Branche zu Branchen-Gruppe aus einer CSV-Datei. + Behandelt UTF-8-BOM-Kodierung und normalisiert die Spaltennamen und Keys. + """ + logger = logging.getLogger(__name__) try: - # Verwenden Sie hier die korrigierte Spaltenüberschrift - df_mapping = pd.read_csv(file_path, sep=';', usecols=['Branchgoup', 'Branch']) - df_mapping.rename(columns={'Branchgoup': 'Branch Group'}, inplace=True) + # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + # +++ KORREKTUR: encoding='utf-8-sig' verwenden, um BOM zu behandeln +++ + # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + # Wir lesen jetzt alle Spalten ein und benennen sie dann um, was robuster ist + # als sich auf exakte Header-Namen in `usecols` zu verlassen. + df_mapping = pd.read_csv(file_path, sep=';', encoding='utf-8-sig') + + # Spaltennamen bereinigen (entfernt BOM und andere unsichtbare Zeichen) + df_mapping.columns = [str(col).strip() for col in df_mapping.columns] + + # Erwartete Spaltennamen (jetzt ohne BOM) + expected_cols = ['Branch Group', 'Branch'] + + # Prüfen, ob die erwarteten Spalten nach der Bereinigung vorhanden sind + if not all(col in df_mapping.columns for col in expected_cols): + logger.error(f"FEHLER: Die erwarteten Spalten {expected_cols} wurden in '{file_path}' nicht gefunden. " + f"Gefundene Spalten: {list(df_mapping.columns)}") + return {} + + # Dictionary erstellen: { 'branch-detail-lowercase': 'Branch-Group' } + branch_map_dict = pd.Series( + df_mapping['Branch Group'].str.strip().values, + index=df_mapping['Branch'].str.strip().str.lower() # Keys werden kleingeschrieben und bereinigt + ).to_dict() - branch_map_dict = pd.Series(df_mapping['Branch Group'].values, index=df_mapping['Branch'].str.strip()).to_dict() logger.info(f"Branchen-Mapping aus '{file_path}' erfolgreich geladen ({len(branch_map_dict)} Einträge).") return branch_map_dict - except ValueError as e: # Fange den spezifischen ValueError - logger.error(f"FEHLER: Spaltennamen in '{file_path}' passen nicht zu den erwarteten Spalten. " - f"Stellen Sie sicher, dass die Header 'Branchgoup' und 'Branch' sind. Fehlerdetails: {e}") - return {} # Gib ein leeres Dictionary zurück, damit das Skript nicht abstürzt + + except FileNotFoundError: + logger.error(f"FEHLER: Branchen-Mapping-Datei '{file_path}' nicht gefunden.") + return {} except Exception as e: - logger.error(f"FEHLER beim Laden der Branchen-Mapping-Datei '{file_path}': {e}") + logger.error(f"FEHLER beim Laden oder Verarbeiten der Branchen-Mapping-Datei '{file_path}': {e}") + logger.debug(traceback.format_exc()) return {} # In Config-Klasse oder global aufrufen: