From 8ef4280b2b37a950c66427cfbd31ee33f017e52f Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 1 Apr 2025 09:20:07 +0000 Subject: [PATCH] v1.2.1: Updated column mapping; Timestamp now in Spalte Y, Version in Spalte Z MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- brancheneinstufung.py | 56 +++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index f17afbcd..74c2dde3 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -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":