diff --git a/brancheneinstufung.py b/brancheneinstufung.py index d4c2d84d..3db592bb 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -13,7 +13,7 @@ import csv # ==================== KONFIGURATION ==================== class Config: - VERSION = "v1.1.15" # v1.1.15: Umsatz in Mio € und Mitarbeiterzahl extrahiert; Unicode normalisiert + VERSION = "v1.1.16" # v1.1.16: Umsatz in Mio € & Mitarbeiterzahl extrahiert; Fallback-Debug bei fehlender Umwandlung LANG = "de" CREDENTIALS_FILE = "service_account.json" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" @@ -45,7 +45,7 @@ def clean_text(text): """Normalisiert Unicode, entfernt Referenzen und extra Whitespace.""" if not text: return "k.A." - # Unicode-Normalisierung: Vereinheitlicht ambigue Zeichen (NFKC) + # Unicode-Normalisierung (NFKC vereinheitlicht ambigue Zeichen) text = unicodedata.normalize("NFKC", str(text)) text = re.sub(r'\[\d+\]', '', text) text = re.sub(r'\s+', ' ', text).strip() @@ -75,33 +75,35 @@ def normalize_company_name(name): def extract_numeric_value(raw_value, is_umsatz=False): """ Extrahiert den numerischen Wert aus raw_value. - - Nutzt Komma als Dezimaltrenner, entfernt Punkte als Tausendertrennzeichen. - - Für Umsatz: Falls "mrd" vorkommt, wird mit 1000 multipliziert; fehlt eine Einheit, wird durch 1e6 geteilt. + - Nutzt Komma als Dezimaltrenner und entfernt Punkte als Tausendertrennzeichen. + - Für Umsatz: Falls "mrd" vorkommt, wird mit 1000 multipliziert; enthält der Text keine Einheit, so wird durch 1e6 geteilt. - Für Mitarbeiter: Gibt den ganzzahligen Wert zurück. + - Falls die Umwandlung fehlschlägt, wird der Original-Rohtext im Debug-Log ausgegeben. """ raw_value = raw_value.strip() if not raw_value: return "k.A." - raw = raw_value.lower() - match = re.search(r'([\d.,]+)', raw) - if not match or not match.group(1): + # Ersetze nichtbrechende Leerzeichen durch normale Leerzeichen + raw = raw_value.lower().replace("\xa0", " ") + match = re.search(r'([\d.,]+)', raw, flags=re.UNICODE) + if not match or not match.group(1).strip(): + debug_print(f"Keine numerischen Zeichen gefunden im Rohtext: '{raw_value}'") return "k.A." num_str = match.group(1) if ',' in num_str: - # Entferne Punkte als Tausendertrennzeichen und ersetze Komma durch Punkt num_str = num_str.replace('.', '').replace(',', '.') try: num = float(num_str) except Exception as e: - debug_print(f"Fehler bei der Umwandlung von {num_str}: {e}") - return "k.A." + debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}") + return raw_value # Rückgabe des Rohtexts als Fallback else: num_str = num_str.replace(' ', '').replace('.', '') try: num = float(num_str) except Exception as e: - debug_print(f"Fehler bei der Umwandlung von {num_str}: {e}") - return "k.A." + debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}") + return raw_value # Rückgabe des Rohtexts als Fallback if is_umsatz: if "mrd" in raw or "milliarden" in raw: num *= 1000