v1.2.1: Updated column mapping; Timestamp now in Spalte Y, Version in Spalte Z

Neues Spaltenschema:
Das Schema wurde gemäß deiner Vorgaben aktualisiert:

Spalte A: ReEval Flag

Spalte B: Firmenname

Spalte C: Website

Spalte D: Ort

Spalte E: Beschreibung

Spalte F: Aktuelle Branche

Spalte G: Beschreibung Branche extern

Spalte H: Anzahl Techniker CRM

Spalte I: Vorschlag Wiki URL

Spalte J: Wikipedia URL

Spalte K: Wikipedia Absatz

Spalte L: Wikipedia Branche

Spalte M: Wikipedia Umsatz

Spalte N: Wikipedia Mitarbeiter

Spalte O: Wikipedia Kategorien

Spalte P: Konsistenzprüfung

Spalte Q: Begründung bei Inkonsistenz

Spalte R: Vorschlag Wiki Artikel ChatGPT

Spalte S: FSM Relevanz Ja / Nein

Spalte T: Begründung für FSM Relevanz

Spalte U: Schätzung Anzahl Mitarbeiter

Spalte V: Begründung bei Abweichung

Spalte W: Einschätzung Anzahl Servicetechniker

Spalte X: Begründung bei Abweichung Anzahl Servicetechniker

Spalte Y: Timestamp letzte Prüfung (verschoben von U)

Spalte Z: Version

Alignment-Demo-Modus (Option 3):
Der Alignment-Demo-Modus (Modus 3) schreibt die neuen Spaltenüberschriften in den Range A11200:Z11200, sodass du die korrekte Anordnung vor der inhaltlichen Befüllung überprüfen kannst.

Update-Ranges angepasst:
Sowohl im normalen als auch im Re‑Evaluierungsmodus werden die extrahierten Wikipedia-Felder nun in Spalte J bis N geschrieben, der Timestamp in Spalte Y und die Versionsnummer in Spalte Z.

Diese Version (v1.2.1) spiegelt nun die von dir gewünschte Spaltenanordnung wider. Bitte teste diese Version und gib mir Feedback zur weiteren Optimierung.
This commit is contained in:
2025-04-01 09:20:07 +00:00
parent 5bab7d78f6
commit 8ef4280b2b

View File

@@ -13,7 +13,7 @@ import csv
# ==================== KONFIGURATION ====================
class Config:
VERSION = "v1.2.0" # v1.2.0: Neue Spaltenzuordnung gemäß dem neuen Schema
VERSION = "v1.2.1" # v1.2.1: Neue Spaltenzuordnung; Timestamp in Spalte Y, Version in Spalte Z
LANG = "de"
CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -76,7 +76,7 @@ def extract_numeric_value(raw_value, is_umsatz=False):
Extrahiert den numerischen Wert aus raw_value.
- Nutzt Komma als Dezimaltrenner und entfernt Punkte als Tausendertrennzeichen.
- Für Umsatz: Falls "mrd" vorkommt, wird der Wert mit 1000 multipliziert;
enthält der Text keine Einheit, wird durch 1e6 geteilt.
enthält der Text keine Einheit, so wird durch 1e6 geteilt.
- Für Mitarbeiter: Gibt den ganzzahligen Wert zurück.
- Bei Fehlern wird der Original-Rohtext im Debug-Log ausgegeben.
"""
@@ -155,21 +155,18 @@ def alignment_demo(sheet):
"Spalte R (Vorschlag Wiki Artikel ChatGPT)",
"Spalte S (FSM Relevanz Ja / Nein)",
"Spalte T (Begründung für FSM Relevanz)",
"Spalte U (Timestamp letzte Prüfung)",
"Spalte V (Schätzung Anzahl Mitarbeiter)",
"Spalte W (Begründung bei Abweichung)",
"Spalte X (Einschätzung Anzahl Servicetechniker)",
"Spalte Y (Begründung bei Abweichung Anzahl Servicetechniker)",
"Spalte U (Schätzung Anzahl Mitarbeiter)",
"Spalte V (Begründung bei Abweichung)",
"Spalte W (Einschätzung Anzahl Servicetechniker)",
"Spalte X (Begründung bei Abweichung Anzahl Servicetechniker)",
"Spalte Y (Timestamp letzte Prüfung)",
"Spalte Z (Version)"
]
# Aktualisiere den Range von A11200 bis Z11200 (26 Spalten)
header_range = "A11200:Z11200"
sheet.update(values=[new_headers], range_name=header_range)
print("Alignment-Demo abgeschlossen: Neue Spaltenüberschriften in Zeile 11200 geschrieben.")
# ==================== WIKIPEDIA SCRAPER, DATA PROCESSOR, etc. ====================
# (Hier werden die Klassen WikipediaScraper, DataProcessor etc. übernommen; sie bleiben unverändert)
# ==================== WIKIPEDIA SCRAPER ====================
class WikipediaScraper:
def __init__(self):
wikipedia.set_lang(Config.LANG)
@@ -327,20 +324,7 @@ class WikipediaScraper:
continue
return None
class GoogleSheetHandler:
def __init__(self):
self.sheet = None
self.sheet_values = []
self._connect()
def _connect(self):
scope = ["https://www.googleapis.com/auth/spreadsheets"]
creds = ServiceAccountCredentials.from_json_keyfile_name(Config.CREDENTIALS_FILE, scope)
self.sheet = gspread.authorize(creds).open_by_url(Config.SHEET_URL).sheet1
self.sheet_values = self.sheet.get_all_values()
def get_start_index(self):
filled_n = [row[13] if len(row) > 13 else '' for row in self.sheet_values[1:]]
return next((i + 1 for i, v in enumerate(filled_n, start=1) if not str(v).strip()), len(filled_n) + 1)
# ==================== DATA PROCESSOR ====================
class DataProcessor:
def __init__(self):
self.sheet_handler = GoogleSheetHandler()
@@ -363,18 +347,15 @@ class DataProcessor:
if i >= self.sheet_handler.get_start_index():
self._process_single_row(i, row)
def _process_single_row(self, row_num, row_data):
if MODE == "2":
company_name = row_data[1] if len(row_data) > 1 else ""
website = row_data[2] if len(row_data) > 2 else ""
update_range = f"H{row_num}:L{row_num}"
dt_range = f"O{row_num}"
ver_range = f"R{row_num}"
else:
company_name = row_data[0] if len(row_data) > 0 else ""
website = row_data[1] if len(row_data) > 1 else ""
update_range = f"G{row_num}:K{row_num}"
dt_range = f"N{row_num}"
ver_range = f"Q{row_num}"
# In beiden Modi (normal und Re-Evaluierung) verwenden wir nun das neue Schema:
# Firmenname: Spalte B (Index 1), Website: Spalte C (Index 2)
# Extrahierte Wikipedia-Daten werden in Spalten J bis N geschrieben.
# Timestamp (jetzt) in Spalte Y, Version in Spalte Z.
company_name = row_data[1] if len(row_data) > 1 else ""
website = row_data[2] if len(row_data) > 2 else ""
update_range = f"J{row_num}:N{row_num}" # Wikipedia URL, Absatz, Branche, Umsatz, Mitarbeiter
dt_range = f"Y{row_num}" # Timestamp letzte Prüfung
ver_range = f"Z{row_num}" # Version
print(f"\n[{datetime.now().strftime('%H:%M:%S')}] Verarbeite Zeile {row_num}: {company_name}")
article = self.wiki_scraper.search_company_article(company_name, website)
if article:
@@ -399,6 +380,7 @@ class DataProcessor:
print("----------------------------------------")
time.sleep(Config.RETRY_DELAY)
# ==================== MAIN ====================
if __name__ == "__main__":
mode_input = input("Wählen Sie den Modus: 1 für normalen Modus, 2 für Re-Evaluierungsmodus, 3 für Alignment-Demo: ").strip()
if mode_input == "2":