This commit is contained in:
2025-04-20 17:15:26 +00:00
parent 5d0768aa7c
commit 8772a0e1f6

View File

@@ -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))