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.") 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): 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." if not raw_value: return "k.A."
# Stelle sicher, dass raw_value ein String ist
raw_value_str = str(raw_value) 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', '-']: if not raw_value_str.strip() or raw_value_str.strip().lower() in ['k.a.', 'n/a', '-']:
return "k.A." return "k.A."
# Bereinige Text vor der Verarbeitung processed_value = clean_text(raw_value_str)
processed_value = clean_text(raw_value_str) # clean_text sollte "k.A." zurückgeben, wenn nichts übrig bleibt
if processed_value == "k.A.": return "k.A." 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})") 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'(?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() 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() 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) match = re.search(r'([\d.]+)', processed_value)
if not match: 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}'") logging.warning(f"Keine numerischen Zeichen gefunden nach Bereinigung von: '{raw_value_str}' -> Ergibt: '{processed_value}'")
return "k.A." return "k.A."
num_str = match.group(1) num_str = match.group(1)
try: 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) num = float(num_str)
except ValueError: except ValueError as e:
# Fehler loggen logging.error(f"Fehler bei Float-Umwandlung des extrahierten Strings '{num_str}' (aus '{processed_value}'): {e}")
logging.error(f"Fehler bei Float-Umwandlung des extrahierten Strings '{num_str}' (aus '{processed_value}')")
return "k.A." return "k.A."
# Multiplikatoren anwenden (Groß/Kleinschreibung ignorieren) original_lower = raw_value_str.lower()
original_lower = raw_value_str.lower() # Nutze Original für Keyword-Suche
multiplier = 1.0 multiplier = 1.0
unit_found = None 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:
if "mrd" in original_lower or "milliarden" in original_lower or "billion" in original_lower: # Englisch Billion = Deutsch Milliarde
multiplier = 1000000000.0 multiplier = 1000000000.0
unit_found = "Mrd" unit_found = "Mrd"
elif "mio" in original_lower or "millionen" in original_lower or "mill." in original_lower: 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: if unit_found:
logging.debug(f" -> Multiplikator '{unit_found}' ({multiplier}) angewendet, Ergebnis: {num}") logging.debug(f" -> Multiplikator '{unit_found}' ({multiplier}) angewendet, Ergebnis: {num}")
# Finale Formatierung
if is_umsatz: if is_umsatz:
# Umsatz in Millionen Euro (als String ohne Nachkommastellen)
umsatz_mio = round(num / 1000000.0) umsatz_mio = round(num / 1000000.0)
logging.debug(f" -> Finaler Umsatz (Mio): {umsatz_mio}") logging.debug(f" -> Finaler Umsatz (Mio): {umsatz_mio}")
return str(int(umsatz_mio)) return str(int(umsatz_mio))
else: else:
# Mitarbeiter als ganze Zahl (als String)
mitarbeiter_int = round(num) mitarbeiter_int = round(num)
logging.debug(f" -> Finale Mitarbeiterzahl: {mitarbeiter_int}") logging.debug(f" -> Finale Mitarbeiterzahl: {mitarbeiter_int}")
return str(int(mitarbeiter_int)) return str(int(mitarbeiter_int))