📊 Zwei Tools – eine Aufgabe
Vereinsregister-Daten aus Google Contacts kommen oft fragmentiert als mehrere CSV-Dateien. Diese beiden Python-Skripte mergen, deduplizieren und filtern sie automatisch – aus Chaos wird eine saubere, nutzbare Kontaktliste.
merge_csv_files.py
Führt alle
vereinsregister_google_kontakte*.csv mit pd.concat() zusammen und entfernt Duplikate.filter_contacts.py
Entfernt Duplikate nach Name+Vereinsname und filtert Kontakte ohne Telefon und Email heraus.
Statistik-Ausgabe
Zeigt an: Kontakte mit Telefon, mit Email, mit beidem – für saubere Erfolgskontrolle.
Wiederverwendbar
Glob-Pattern-basiert – neue CSV-Dateien werden automatisch erkannt und eingebunden.
💻 Echter Code aus dem Projekt
merge_csv_files.py – Alle CSVs zu einer zusammenführen
import pandas as pd
import glob
def merge_csv_files():
# Alle passenden CSV-Dateien finden
csv_files = glob.glob('vereinsregister_google_kontakte*.csv')
if not csv_files:
print("Keine CSV-Dateien gefunden!")
return
dfs = []
for file in csv_files:
try:
df = pd.read_csv(file, encoding='utf-8')
dfs.append(df)
print(f"{file} erfolgreich eingelesen")
except Exception as e:
print(f"Fehler bei {file}: {e}")
# Zusammenführen & Duplikate entfernen
merged_df = pd.concat(dfs, ignore_index=True)
merged_df = merged_df.drop_duplicates()
output_file = 'vereinsregister_google_kontakte_komplett.csv'
merged_df.to_csv(output_file, index=False, encoding='utf-8')
print(f"Fertig! {len(merged_df)} Vereine in {output_file}")
filter_contacts.py – Bereinigung & Filterung
import pandas as pd
def filter_contacts():
df = pd.read_csv('vereinsregister_google_kontakte_komplett.csv',
encoding='utf-8')
print(f"Ursprünglich: {len(df)} Kontakte")
# 1. Duplikate nach Name + Vereinsname
df = df.drop_duplicates(subset=['Name', 'Vereinsname'])
print(f"Nach Duplikat-Entfernung: {len(df)}")
# 2. Nur Kontakte mit Telefon ODER Email behalten
df = df[~((df['Telefon'].isna() |
df['Telefon'].str.strip() == '') &
(df['E-Mail'].isna() |
df['E-Mail'].str.strip() == ''))]
print(f"Nach Filterung (Tel. oder Email): {len(df)}")
# 3. Alphabetisch sortieren
df = df.sort_values('Name')
output_file = 'vereinsregister_google_kontakte_gefiltert.csv'
df.to_csv(output_file, index=False, encoding='utf-8')
# Statistik
print(f"\nTel: {df['Telefon'].notna().sum()}")
print(f"Email: {df['E-Mail'].notna().sum()}")
print(f"Beides: {df[(df['Telefon'].notna()) & (df['E-Mail'].notna())].shape[0]}")
if __name__ == "__main__":
filter_contacts()
Workflow: Vom Export zur bereinigten Liste
# 1. Google Contacts Export als CSV (mehrere Dateien)
# → vereinsregister_google_kontakte_01.csv
# → vereinsregister_google_kontakte_02.csv
# 2. Mergen
python merge_csv_files.py
# → vereinsregister_google_kontakte_komplett.csv
# 3. Filtern & bereinigen
python filter_contacts.py
# → vereinsregister_google_kontakte_gefiltert.csv
# Ergebnis: Saubere Liste, sortiert, ohne Dubletten,
# nur Kontakte mit mind. Telefon oder Email
🎯 Business Value
Statt Stunden: Sekunden
400+ Vereinskontakte manuell zu bereinigen dauert Stunden. Das Skript erledigt es in unter einer Sekunde.
Wiederverwendbar
Bei jeder Aktualisierung der Kontaktdaten einfach neu ausführen – immer das gleiche, konsistente Ergebnis.
Datenqualität messbar
Die Statistik-Ausgabe zeigt sofort, wie viele Kontakte wirklich erreichbar sind – keine blinde Datenhaltung.