From 6bf9b762c07b9211c7314ffe844588c5b0d9159f Mon Sep 17 00:00:00 2001 From: Floke Date: Sun, 11 May 2025 06:17:04 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 81 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 6 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index fac090e2..259f62d8 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -1063,12 +1063,12 @@ def load_target_schema(csv_filepath=BRANCH_MAPPING_FILE): logger.info(f"Lade Ziel-Schema und Fokus-Branchen aus '{csv_filepath}'...") - try: - with open(csv_filepath, "r", encoding="utf-8-sig") as f: - reader = csv.reader(f) - try: - header_row = next(reader) # Überspringe Header - logger.debug(f"Ueberspringe Header-Zeile im Schema: {header_row}") + try: + with open(csv_filepath, "r", encoding="utf-8-sig") as f: + reader = csv.reader(f, delimiter=';') # <<< HINZUGEFÜGT: delimiter=';' + try: + header_row = next(reader) + logger.debug(f"Ueberspringe Header-Zeile im Schema: {header_row}") except StopIteration: logger.warning(f"Schema-Datei '{csv_filepath}' ist leer oder hat keinen Header.") TARGET_SCHEMA_STRING = "Ziel-Branchenschema nicht verfuegbar (Datei leer)." @@ -9564,6 +9564,21 @@ def main(): # openai_handler = OpenAIHandler() # serpapi_handler = SerpAPIHandler() + logger.info("===== Spalten-Alignment Check =====") + if sheet_handler and sheet_handler.sheet_values and len(sheet_handler.sheet_values) > 0: + sheet_headers = sheet_handler.sheet_values[0] + logger.info(f"Header aus Google Sheet (erste {len(sheet_headers)} Spalten): {sheet_headers}") + + # Ausgabe der COLUMN_MAP für den Abgleich (gekürzt für Lesbarkeit im Log) + logger.info("Aktuelle COLUMN_MAP (Auszug):") + for i, (key, value) in enumerate(COLUMN_MAP.items()): + if i < 5 or i > len(COLUMN_MAP) - 6 : # Zeige erste 5 und letzte 5 + logger.info(f" '{key}': {value}") + elif i == 5: + logger.info(" ...") + else: + logger.warning("Konnte Header nicht aus Google Sheet laden für Alignment Check.") + logger.info("===================================") # Initialisiere DataProcessor Instanz (Block 15) mit Handlern # Uebergeben Sie alle benoetigten Handler an den DataProcessor. @@ -9658,6 +9673,60 @@ def main(): print(f"Ein Fehler ist bei der Modus-Eingabe aufgetreten ({e}). Bitte pruefen Sie die Logdatei.") return # Beende das Skript bei unerwartetem Fehler + # ============================================================================== + # === NEUER BLOCK: Interaktive Limit-Abfrage === + # ============================================================================== + limit_arg_cli = args.limit # ursprüngliches Limit vom CLI Argument + final_limit_to_use = limit_arg_cli # Standardmäßig das CLI-Limit verwenden + + # Wenn kein Limit über CLI gesetzt wurde UND der Modus nicht einer der ist, + # bei denen ein Zeilenlimit typischerweise keinen Sinn macht. + # (Für 'alignment' und 'train_technician_model' ist ein Zeilen-Durchlauf-Limit meist nicht relevant) + # 'check_urls' und andere Batch-Modi können aber von einem Limit profitieren. + skippable_limit_modes = ['alignment', 'train_technician_model'] + + if final_limit_to_use is None and selected_mode not in skippable_limit_modes: + while True: + try: + limit_input_str = input(f"Maximale Anzahl zu verarbeitender Zeilen für Modus '{selected_mode}' (Enter für Unbegrenzt, aktuell: Unbegrenzt): ").strip() + if not limit_input_str: # Benutzer drückt Enter + final_limit_to_use = None + logger.info("Kein Limit für Zeilenverarbeitung gesetzt (interaktiv).") + break + + # Versuche, in Integer umzuwandeln + temp_limit = int(limit_input_str) + + if temp_limit <= 0: + logger.warning(f"Ungültiges Limit '{temp_limit}' (<=0) eingegeben, wird als Unbegrenzt behandelt.") + final_limit_to_use = None + else: + final_limit_to_use = temp_limit + logger.info(f"Limit für Zeilenverarbeitung (interaktiv gesetzt): {final_limit_to_use}") + break # Gültige Eingabe oder Entscheidung für "Unbegrenzt" + except ValueError: + print("Ungültige Eingabe. Bitte eine ganze Zahl eingeben oder Enter für Unbegrenzt.") + except EOFError: + logger.warning("Interaktive Limit-Eingabe abgebrochen. Nutze kein Limit (oder CLI-Vorgabe, falls vorhanden).") + # final_limit_to_use behält den Wert von limit_arg_cli (also None, wenn hierher gekommen) + break + except Exception as e_limit_input: + logger.error(f"Unerwarteter Fehler bei interaktiver Limit-Eingabe: {e_limit_input}") + logger.debug(traceback.format_exc()) + print("Ein Fehler ist bei der Limit-Eingabe aufgetreten. Nutze kein Limit.") + final_limit_to_use = None + break + elif final_limit_to_use is not None: # Wenn ein Limit via CLI gesetzt wurde + logger.info(f"Verwende Limit aus CLI-Argument: {final_limit_to_use}") + elif selected_mode in skippable_limit_modes and final_limit_to_use is None: + logger.info(f"Modus '{selected_mode}' benötigt typischerweise kein Zeilenlimit. Limit-Abfrage übersprungen.") + + + # Die Variable `final_limit_to_use` enthält nun das anzuwendende Limit (entweder von CLI, interaktiv oder None) + # ============================================================================== + # === ENDE NEUER BLOCK === + # ============================================================================== + # --- Ausfuehrung des gewaehlten Modus --- try: