v1.2.0: Updated column mapping per new schema with Alignment-Demo mode
Neues Spaltenschema: Die Alignment-Demo (Modus 3) wurde angepasst, um die neuen Spaltenüberschriften A–Z gemäß dem neuen Schema zu schreiben: 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 (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 Z (Version) Alignment-Demo-Modus (Option 3): Beim Starten des Modus 3 wird in Zeile 11200 der Range A11200:Z11200 mit den neuen Überschriften gefüllt, sodass du das Spaltenlayout vor der inhaltlichen Befüllung überprüfen kannst. Restliche Funktionalität: Die bestehenden Funktionen (Wikipedia-Suche, Umsatz- und Mitarbeiterextraktion etc.) bleiben unverändert.
This commit is contained in:
@@ -13,7 +13,7 @@ import csv
|
|||||||
|
|
||||||
# ==================== KONFIGURATION ====================
|
# ==================== KONFIGURATION ====================
|
||||||
class Config:
|
class Config:
|
||||||
VERSION = "v1.2.0" # v1.2.0: Neue Spaltenanordnung, Alignment-Demo-Modus (Option 3)
|
VERSION = "v1.2.0" # v1.2.0: Neue Spaltenzuordnung gemäß dem neuen Schema
|
||||||
LANG = "de"
|
LANG = "de"
|
||||||
CREDENTIALS_FILE = "service_account.json"
|
CREDENTIALS_FILE = "service_account.json"
|
||||||
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
|
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
|
||||||
@@ -75,7 +75,8 @@ def extract_numeric_value(raw_value, is_umsatz=False):
|
|||||||
"""
|
"""
|
||||||
Extrahiert den numerischen Wert aus raw_value.
|
Extrahiert den numerischen Wert aus raw_value.
|
||||||
- Nutzt Komma als Dezimaltrenner und entfernt Punkte als Tausendertrennzeichen.
|
- 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, so wird durch 1e6 geteilt.
|
- Für Umsatz: Falls "mrd" vorkommt, wird der Wert mit 1000 multipliziert;
|
||||||
|
enthält der Text keine Einheit, wird durch 1e6 geteilt.
|
||||||
- Für Mitarbeiter: Gibt den ganzzahligen Wert zurück.
|
- Für Mitarbeiter: Gibt den ganzzahligen Wert zurück.
|
||||||
- Bei Fehlern wird der Original-Rohtext im Debug-Log ausgegeben.
|
- Bei Fehlern wird der Original-Rohtext im Debug-Log ausgegeben.
|
||||||
"""
|
"""
|
||||||
@@ -94,14 +95,14 @@ def extract_numeric_value(raw_value, is_umsatz=False):
|
|||||||
num = float(num_str)
|
num = float(num_str)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
|
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
|
||||||
return raw_value # Fallback: Originaltext
|
return raw_value
|
||||||
else:
|
else:
|
||||||
num_str = num_str.replace(' ', '').replace('.', '')
|
num_str = num_str.replace(' ', '').replace('.', '')
|
||||||
try:
|
try:
|
||||||
num = float(num_str)
|
num = float(num_str)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
|
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
|
||||||
return raw_value # Fallback: Originaltext
|
return raw_value
|
||||||
if is_umsatz:
|
if is_umsatz:
|
||||||
if "mrd" in raw or "milliarden" in raw:
|
if "mrd" in raw or "milliarden" in raw:
|
||||||
num *= 1000
|
num *= 1000
|
||||||
@@ -128,7 +129,47 @@ class GoogleSheetHandler:
|
|||||||
filled_n = [row[13] if len(row) > 13 else '' for row in self.sheet_values[1:]]
|
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)
|
return next((i + 1 for i, v in enumerate(filled_n, start=1) if not str(v).strip()), len(filled_n) + 1)
|
||||||
|
|
||||||
# ==================== WIKIPEDIA SCRAPER ====================
|
# ==================== ALIGNMENT DEMO (Modus 3) ====================
|
||||||
|
def alignment_demo(sheet):
|
||||||
|
"""
|
||||||
|
Alignment-Demo: Schreibt in Zeile 11200 die neuen Spaltenüberschriften gemäß dem neuen Schema.
|
||||||
|
"""
|
||||||
|
new_headers = [
|
||||||
|
"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 (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 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)
|
||||||
|
|
||||||
class WikipediaScraper:
|
class WikipediaScraper:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
wikipedia.set_lang(Config.LANG)
|
wikipedia.set_lang(Config.LANG)
|
||||||
@@ -286,32 +327,20 @@ class WikipediaScraper:
|
|||||||
continue
|
continue
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# ==================== ALIGNMENT DEMO (Modus 3) ====================
|
class GoogleSheetHandler:
|
||||||
def alignment_demo(sheet):
|
def __init__(self):
|
||||||
"""
|
self.sheet = None
|
||||||
Dieser Modus schreibt eine Demo-Zeile (z.B. in Zeile 11200) mit den neuen Spaltenüberschriften.
|
self.sheet_values = []
|
||||||
Passe die Liste new_headers an das gewünschte neue Schema an.
|
self._connect()
|
||||||
"""
|
def _connect(self):
|
||||||
# Beispiel für neue Spaltenüberschriften (bitte anpassen, falls das Schema anders lautet):
|
scope = ["https://www.googleapis.com/auth/spreadsheets"]
|
||||||
new_headers = [
|
creds = ServiceAccountCredentials.from_json_keyfile_name(Config.CREDENTIALS_FILE, scope)
|
||||||
"Re-Eval Flag", # z. B. Spalte A
|
self.sheet = gspread.authorize(creds).open_by_url(Config.SHEET_URL).sheet1
|
||||||
"Firmenname", # Spalte B
|
self.sheet_values = self.sheet.get_all_values()
|
||||||
"Website", # Spalte C
|
def get_start_index(self):
|
||||||
"Branche (Datenbank)",# Neue Spalte (grün)
|
filled_n = [row[13] if len(row) > 13 else '' for row in self.sheet_values[1:]]
|
||||||
"Branche Wikipedia", # Bestand
|
return next((i + 1 for i, v in enumerate(filled_n, start=1) if not str(v).strip()), len(filled_n) + 1)
|
||||||
"Umsatz Wikipedia (Mio €)", # Bestand
|
|
||||||
"Mitarbeiter Wikipedia", # Bestand
|
|
||||||
"Erster Absatz Wikipedia", # Neu verschoben
|
|
||||||
"Wikipedia URL", # Bestand
|
|
||||||
"Datum der Extraktion", # Neu
|
|
||||||
"Version" # Neu
|
|
||||||
]
|
|
||||||
# Schreibe die neuen Header in Zeile 11200 (A11200 bis K11200)
|
|
||||||
header_range = "A11200:K11200"
|
|
||||||
sheet.update(values=[new_headers], range_name=header_range)
|
|
||||||
print("Alignment-Demo abgeschlossen: Neue Spaltenüberschriften in Zeile 11200 geschrieben.")
|
|
||||||
|
|
||||||
# ==================== DATA PROCESSOR ====================
|
|
||||||
class DataProcessor:
|
class DataProcessor:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.sheet_handler = GoogleSheetHandler()
|
self.sheet_handler = GoogleSheetHandler()
|
||||||
@@ -320,7 +349,7 @@ class DataProcessor:
|
|||||||
if MODE == "2":
|
if MODE == "2":
|
||||||
print("Re-Evaluierungsmodus: Verarbeitung aller Zeilen mit 'x' in Spalte A.")
|
print("Re-Evaluierungsmodus: Verarbeitung aller Zeilen mit 'x' in Spalte A.")
|
||||||
elif MODE == "3":
|
elif MODE == "3":
|
||||||
print("Alignment-Demo-Modus: Schreibe Spaltenüberschriften in Zeile 11200.")
|
print("Alignment-Demo-Modus: Schreibe neue Spaltenüberschriften in Zeile 11200.")
|
||||||
alignment_demo(self.sheet_handler.sheet)
|
alignment_demo(self.sheet_handler.sheet)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
@@ -370,7 +399,6 @@ class DataProcessor:
|
|||||||
print("----------------------------------------")
|
print("----------------------------------------")
|
||||||
time.sleep(Config.RETRY_DELAY)
|
time.sleep(Config.RETRY_DELAY)
|
||||||
|
|
||||||
# ==================== MAIN ====================
|
|
||||||
if __name__ == "__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()
|
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":
|
if mode_input == "2":
|
||||||
@@ -389,4 +417,4 @@ if __name__ == "__main__":
|
|||||||
num_rows = None
|
num_rows = None
|
||||||
processor = DataProcessor()
|
processor = DataProcessor()
|
||||||
processor.process_rows(num_rows)
|
processor.process_rows(num_rows)
|
||||||
print("\n✅ Wikipedia-Auswertung abgeschlossen")
|
print("\n✅ Wikipedia-Auswertung abgeschlossen (v1.2.0)")
|
||||||
|
|||||||
Reference in New Issue
Block a user