bugfix
This commit is contained in:
@@ -109,49 +109,42 @@ PATTERNS_FILE_TXT = "technician_patterns.txt" # Alt (Optional beibehalten)
|
|||||||
PATTERNS_FILE_JSON = "technician_patterns.json" # Neu (Empfohlen)
|
PATTERNS_FILE_JSON = "technician_patterns.json" # Neu (Empfohlen)
|
||||||
|
|
||||||
def load_branch_mapping(file_path='Branchen.csv'):
|
def load_branch_mapping(file_path='Branchen.csv'):
|
||||||
"""
|
|
||||||
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__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
# +++ 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')
|
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]
|
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
|
expected_cols = ['Branch Group', 'Branch']
|
||||||
if not all(col in df_mapping.columns for col in expected_cols):
|
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. "
|
logger.error(f"FEHLER: Erwartete Spalten {expected_cols} in '{file_path}' nicht gefunden.")
|
||||||
f"Gefundene Spalten: {list(df_mapping.columns)}")
|
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
# Dictionary erstellen: { 'branch-detail-lowercase': 'Branch-Group' }
|
# Verwende die neue Normalisierungsfunktion für die Keys
|
||||||
branch_map_dict = pd.Series(
|
branch_map_dict = pd.Series(
|
||||||
df_mapping['Branch Group'].str.strip().values,
|
df_mapping['Branch Group'].str.strip().values,
|
||||||
index=df_mapping['Branch'].str.strip().str.lower() # Keys werden kleingeschrieben und bereinigt
|
index=df_mapping['Branch'].apply(normalize_for_mapping) # HIER ANWENDEN
|
||||||
).to_dict()
|
).to_dict()
|
||||||
|
|
||||||
logger.info(f"Branchen-Mapping aus '{file_path}' erfolgreich geladen ({len(branch_map_dict)} Einträge).")
|
logger.info(f"Branchen-Mapping aus '{file_path}' geladen ({len(branch_map_dict)} Einträge).")
|
||||||
return branch_map_dict
|
return branch_map_dict
|
||||||
|
|
||||||
except FileNotFoundError:
|
|
||||||
logger.error(f"FEHLER: Branchen-Mapping-Datei '{file_path}' nicht gefunden.")
|
|
||||||
return {}
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"FEHLER beim Laden oder Verarbeiten der Branchen-Mapping-Datei '{file_path}': {e}")
|
logger.error(f"FEHLER beim Laden der Branchen-Mapping-Datei '{file_path}': {e}")
|
||||||
logger.debug(traceback.format_exc())
|
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_for_mapping(text):
|
||||||
|
"""
|
||||||
|
Normalisiert einen String aggressiv für Mapping-Zwecke.
|
||||||
|
Entfernt Leerzeichen, macht alles klein, ersetzt gängige Sonderzeichen.
|
||||||
|
"""
|
||||||
|
if not isinstance(text, str):
|
||||||
|
return ""
|
||||||
|
text = text.lower()
|
||||||
|
text = text.strip()
|
||||||
|
# Ersetze gängige Trennzeichen und Varianten durch nichts, um sie zu ignorieren
|
||||||
|
text = re.sub(r'[\s/,-]+', '', text)
|
||||||
|
return text
|
||||||
|
|
||||||
# In Config-Klasse oder global aufrufen:
|
# In Config-Klasse oder global aufrufen:
|
||||||
BRANCH_MAPPING = load_branch_mapping()
|
BRANCH_MAPPING = load_branch_mapping()
|
||||||
|
|
||||||
@@ -9149,7 +9142,9 @@ class DataProcessor:
|
|||||||
|
|
||||||
# --- Kategoriale Features vorbereiten (Branche) ---
|
# --- Kategoriale Features vorbereiten (Branche) ---
|
||||||
branche_col_internal = "branche_ki" # Name der Spalte mit den Detail-Branchen
|
branche_col_internal = "branche_ki" # Name der Spalte mit den Detail-Branchen
|
||||||
self.logger.info(f"Verarbeite kategoriales Feature '{branche_col_internal}' (aus Spalte AL) und mappe es zu 'Branchen_Gruppe'...")
|
self.logger.info(f"Verarbeite kategoriales Feature '{branche_col_internal}' und mappe es zu 'Branchen_Gruppe'...")
|
||||||
|
|
||||||
|
normalized_sheet_branches = df_filtered[branche_col_internal].apply(normalize_for_mapping)
|
||||||
|
|
||||||
if branche_col_internal not in df_filtered.columns:
|
if branche_col_internal not in df_filtered.columns:
|
||||||
self.logger.critical(f"FEHLER: Spalte '{branche_col_internal}' nicht im DataFrame gefunden.")
|
self.logger.critical(f"FEHLER: Spalte '{branche_col_internal}' nicht im DataFrame gefunden.")
|
||||||
@@ -9170,7 +9165,7 @@ class DataProcessor:
|
|||||||
# Erstelle eine normalisierte Version des Mapping-Dictionaries
|
# Erstelle eine normalisierte Version des Mapping-Dictionaries
|
||||||
mapping_lower = {k.lower(): v for k, v in BRANCH_MAPPING.items()}
|
mapping_lower = {k.lower(): v for k, v in BRANCH_MAPPING.items()}
|
||||||
# Wende dieses normalisierte Mapping auf die normalisierte Branchenspalte an
|
# Wende dieses normalisierte Mapping auf die normalisierte Branchenspalte an
|
||||||
df_filtered.loc[:, 'Branchen_Gruppe'] = cleaned_branches.str.lower().map(mapping_lower).fillna('Sonstige')
|
df_filtered.loc[:, 'Branchen_Gruppe'] = normalized_sheet_branches.map(BRANCH_MAPPING).fillna('Sonstige')
|
||||||
|
|
||||||
self.logger.info("Mapping zu 'Branchen_Gruppe' durchgeführt.")
|
self.logger.info("Mapping zu 'Branchen_Gruppe' durchgeführt.")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user