This commit is contained in:
2025-05-11 06:17:04 +00:00
parent a42e04d66d
commit 6bf9b762c0

View File

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