From 8772a0e1f60641fc7b842ccba0e9ccc6c747259a Mon Sep 17 00:00:00 2001 From: Floke Date: Sun, 20 Apr 2025 17:15:26 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 5401403b..b6920166 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -857,56 +857,47 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N logging.info(f"Wiki-Updates abgeschlossen. {processed_rows_count} Zeilen geprüft. {updated_url_count} URLs kopiert & für ReEval markiert, {cleared_suggestion_count} ungültige Vorschläge gelöscht/markiert.") def extract_numeric_value(raw_value, is_umsatz=False): - """Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter).""" + """Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter). + Berücksichtigt jetzt auch Apostroph (') als Tausendertrenner.""" if not raw_value: return "k.A." - # Stelle sicher, dass raw_value ein String ist raw_value_str = str(raw_value) - # Frühe Prüfung auf leeren String oder bekannte "Nicht verfügbar"-Werte if not raw_value_str.strip() or raw_value_str.strip().lower() in ['k.a.', 'n/a', '-']: return "k.A." - # Bereinige Text vor der Verarbeitung - processed_value = clean_text(raw_value_str) # clean_text sollte "k.A." zurückgeben, wenn nichts übrig bleibt + processed_value = clean_text(raw_value_str) if processed_value == "k.A.": return "k.A." - # Debug-Log des zu verarbeitenden Werts logging.debug(f"extract_numeric_value: Verarbeite Wert: '{processed_value}' (is_umsatz={is_umsatz})") - # Entferne Präfixe wie ca., über, etc. und Währungssymbole (€, $, etc.) + # --- Anpassung hier: Entferne auch Apostroph --- processed_value = re.sub(r'(?i)^\s*(ca\.?|circa|rund|etwa|über|unter|mehr als|weniger als|bis zu)\s+', '', processed_value) processed_value = re.sub(r'[€$£¥]', '', processed_value).strip() - - # Behandle Bereiche (z.B. "100 - 200 Mio") -> Nimm die erste Zahl processed_value = re.split(r'\s*(-|–|bis)\s*', processed_value, 1)[0].strip() + # Entferne Punkte UND Apostrophe als Tausendertrenner + processed_value = processed_value.replace('.', '').replace("'", "") + # Ersetze Komma durch Punkt für Dezimaltrennung + processed_value = processed_value.replace(',', '.') + # --- Ende Anpassung --- - # Entferne Tausendertrennzeichen (Punkte oder Kommas, abhängig von Lokalisierung - hier generell Punkte) - # Behalte Komma als mögliches Dezimaltrennzeichen - processed_value = processed_value.replace('.', '') # Entferne Punkte GANZ - processed_value = processed_value.replace(',', '.') # Ersetze Komma durch Punkt - - # Suche nach der ersten Zahl (kann Dezimalpunkt enthalten) - # Erlaube optional ein Leerzeichen vor Einheiten wie Mio/Mrd etc. match = re.search(r'([\d.]+)', processed_value) if not match: - # Warne, wenn keine Zahl gefunden wurde logging.warning(f"Keine numerischen Zeichen gefunden nach Bereinigung von: '{raw_value_str}' -> Ergibt: '{processed_value}'") return "k.A." num_str = match.group(1) try: + # Versuche, leere Strings oder nur '.' abzufangen + if not num_str or num_str == '.': raise ValueError("Leerer oder ungültiger Zahlenstring") num = float(num_str) - except ValueError: - # Fehler loggen - logging.error(f"Fehler bei Float-Umwandlung des extrahierten Strings '{num_str}' (aus '{processed_value}')") + except ValueError as e: + logging.error(f"Fehler bei Float-Umwandlung des extrahierten Strings '{num_str}' (aus '{processed_value}'): {e}") return "k.A." - # Multiplikatoren anwenden (Groß/Kleinschreibung ignorieren) - original_lower = raw_value_str.lower() # Nutze Original für Keyword-Suche + original_lower = raw_value_str.lower() multiplier = 1.0 unit_found = None - # Priorisiere spezifischere Einheiten zuerst (Mrd. vor Mio.) - if "mrd" in original_lower or "milliarden" in original_lower or "billion" in original_lower: # Englisch Billion = Deutsch Milliarde + if "mrd" in original_lower or "milliarden" in original_lower or "billion" in original_lower: multiplier = 1000000000.0 unit_found = "Mrd" elif "mio" in original_lower or "millionen" in original_lower or "mill." in original_lower: @@ -920,14 +911,11 @@ def extract_numeric_value(raw_value, is_umsatz=False): if unit_found: logging.debug(f" -> Multiplikator '{unit_found}' ({multiplier}) angewendet, Ergebnis: {num}") - # Finale Formatierung if is_umsatz: - # Umsatz in Millionen Euro (als String ohne Nachkommastellen) umsatz_mio = round(num / 1000000.0) logging.debug(f" -> Finaler Umsatz (Mio): {umsatz_mio}") return str(int(umsatz_mio)) else: - # Mitarbeiter als ganze Zahl (als String) mitarbeiter_int = round(num) logging.debug(f" -> Finale Mitarbeiterzahl: {mitarbeiter_int}") return str(int(mitarbeiter_int))