#!/usr/bin/env python3 """ Einfacher Eurojackpot Data Updater Manuelle Eingabe oder CSV-Import von neuen Ziehungen. Perfekt als Fallback wenn Web-Scraping nicht funktioniert. """ import pandas as pd from datetime import datetime import shutil import os def load_existing_data(data_file): """Lädt existierende Daten.""" print("📂 Lade existierende Daten...") if not os.path.exists(data_file): print(" ⚠️ Datei existiert nicht - erstelle neue") return pd.DataFrame(columns=['datum', 'Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'SZ1', 'SZ2']) df = pd.read_csv(data_file, sep=';') df['datum'] = pd.to_datetime(df['datum'], format='%Y-%m-%d', errors='coerce') print(f" ✅ {len(df)} Ziehungen geladen") if len(df) > 0: print(f" 📅 Neueste: {df['datum'].max().strftime('%Y-%m-%d')}") return df def create_backup(data_file): """Erstellt Backup.""" if not os.path.exists(data_file): return print("\n💾 Erstelle Backup...") timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") backup_dir = os.path.join(os.path.dirname(data_file), "backups") os.makedirs(backup_dir, exist_ok=True) backup_file = os.path.join(backup_dir, f"{os.path.basename(data_file)}.backup_{timestamp}") shutil.copy2(data_file, backup_file) print(f" ✅ Backup: {os.path.basename(backup_file)}") def manual_input_mode(): """Manuelle Eingabe von Ziehungen.""" print("\n⌨️ MANUELLE EINGABE") print("=" * 70) print("Format: YYYY-MM-DD Z1 Z2 Z3 Z4 Z5 SZ1 SZ2") print("Beispiel: 2025-01-24 7 18 26 37 46 3 11") print("Leer lassen zum Beenden.\n") draws = [] while True: user_input = input(f"Ziehung {len(draws) + 1}: ").strip() if not user_input: break try: parts = user_input.split() if len(parts) != 8: print(" ❌ Ungültiges Format. Bitte 8 Werte eingeben.") continue date_obj = datetime.strptime(parts[0], '%Y-%m-%d') numbers = [int(parts[i]) for i in range(1, 6)] euro_numbers = [int(parts[i]) for i in range(6, 8)] # Validierung if not all(1 <= n <= 50 for n in numbers): print(" ❌ Hauptzahlen müssen zwischen 1 und 50 liegen.") continue if not all(1 <= n <= 12 for n in euro_numbers): print(" ❌ Eurozahlen müssen zwischen 1 und 12 liegen.") continue if len(set(numbers)) != 5: print(" ❌ Hauptzahlen müssen eindeutig sein.") continue if len(set(euro_numbers)) != 2: print(" ❌ Eurozahlen müssen eindeutig sein.") continue # Sortiere Zahlen numbers_sorted = sorted(numbers) euro_sorted = sorted(euro_numbers) draws.append({ 'datum': date_obj, 'Z1': numbers_sorted[0], 'Z2': numbers_sorted[1], 'Z3': numbers_sorted[2], 'Z4': numbers_sorted[3], 'Z5': numbers_sorted[4], 'SZ1': euro_sorted[0], 'SZ2': euro_sorted[1] }) print(f" ✅ Hinzugefügt: {date_obj.strftime('%Y-%m-%d')} | " f"{numbers_sorted[0]}-{numbers_sorted[1]}-{numbers_sorted[2]}-{numbers_sorted[3]}-{numbers_sorted[4]} | " f"{euro_sorted[0]}-{euro_sorted[1]}") except ValueError as e: print(f" ❌ Fehler: {e}") continue return draws def csv_import_mode(): """CSV-Import von Ziehungen.""" print("\n📁 CSV-IMPORT") print("=" * 70) print("CSV-Format: datum;Z1;Z2;Z3;Z4;Z5;SZ1;SZ2") print("Beispiel: 2025-01-24;7;18;26;37;46;3;11\n") csv_file = input("Pfad zur CSV-Datei: ").strip() if not os.path.exists(csv_file): print(f" ❌ Datei nicht gefunden: {csv_file}") return [] try: df_import = pd.read_csv(csv_file, sep=';') df_import['datum'] = pd.to_datetime(df_import['datum'], format='%Y-%m-%d', errors='coerce') draws = df_import.to_dict('records') print(f" ✅ {len(draws)} Ziehungen aus CSV geladen") # Zeige erste 3 for i, draw in enumerate(draws[:3]): print(f" {i+1}. {draw['datum'].strftime('%Y-%m-%d')} | " f"{draw['Z1']}-{draw['Z2']}-{draw['Z3']}-{draw['Z4']}-{draw['Z5']} | " f"{draw['SZ1']}-{draw['SZ2']}") if len(draws) > 3: print(f" ... und {len(draws) - 3} weitere") return draws except Exception as e: print(f" ❌ Fehler beim Laden: {e}") return [] def merge_and_save(df_existing, new_draws, data_file): """Merged und speichert Daten.""" if not new_draws: print("\n⚠️ Keine neuen Ziehungen zum Hinzufügen") return False print(f"\n🔀 Merge {len(new_draws)} neue Ziehung(en)...") df_new = pd.DataFrame(new_draws) df_combined = pd.concat([df_existing, df_new], ignore_index=True) # Duplikate entfernen before = len(df_combined) df_combined = df_combined.drop_duplicates(subset=['datum'], keep='first') after = len(df_combined) if before - after > 0: print(f" 🗑️ {before - after} Duplikat(e) entfernt") # Sortieren df_combined = df_combined.sort_values('datum', ascending=True).reset_index(drop=True) # Speichern print(f"\n💾 Speichere {len(df_combined)} Ziehungen...") df_export = df_combined.copy() df_export['datum'] = df_export['datum'].dt.strftime('%Y-%m-%d') df_export.to_csv(data_file, sep=';', index=False) print(f" ✅ Gespeichert: {data_file}") print(f" 📊 Vorher: {len(df_existing)} | Neu: {len(df_combined) - len(df_existing)} | Gesamt: {len(df_combined)}") return True def main(): """Hauptfunktion.""" print() print("=" * 70) print(" EUROJACKPOT SIMPLE UPDATER") print(" Manuelle Eingabe oder CSV-Import") print("=" * 70) print() # Datei-Pfad default_file = "/Users/sebastianfrohlich/Library/Mobile Documents/com~apple~CloudDocs/Jupyter Notebooks/Eurojackpot/data/AlleEurojackpotzahlen.csv" print(f"Standard-Datei: {default_file}") use_default = input("\nStandard verwenden? (j/n): ").strip().lower() if use_default in ['j', 'ja', 'y', 'yes', '']: data_file = default_file else: data_file = input("Pfad zur Datei: ").strip() print() # Lade existierende Daten df_existing = load_existing_data(data_file) # Backup create_backup(data_file) # Eingabe-Modus wählen print("\n📝 EINGABE-MODUS") print("=" * 70) print("1. Manuelle Eingabe (einzelne Ziehungen)") print("2. CSV-Import (mehrere Ziehungen)") print() mode = input("Wahl (1/2): ").strip() if mode == '2': new_draws = csv_import_mode() else: new_draws = manual_input_mode() # Merge und speichern success = merge_and_save(df_existing, new_draws, data_file) print() print("=" * 70) if success: print("✅ UPDATE ERFOLGREICH") else: print("⚠️ KEINE ÄNDERUNGEN") print("=" * 70) if __name__ == "__main__": main()