Programm zur Analyse meiner Kontoauszüge bei Easybank
Kontoanalyse.py
usage: kontoanalyse.py [-h] [--export CSV] [--suche BEGRIFF]
[--feld {konto,name,referenz,alle}] [--regex]
[--von DATUM] [--bis DATUM] [--datum {buchung,umsatz}]
datei
Kontoauszug-CSV nach Empfängern auswerten.
positional arguments:
datei Pfad zur CSV-Datei
options:
-h, --help show this help message and exit
--export CSV Ergebnis (bzw. Treffer) als CSV speichern
--suche BEGRIFF Buchungen suchen statt Kategorien auszuwerten
--feld {konto,name,referenz,alle}
Suchfeld: konto, name, referenz oder alle (Standard)
--regex Suchbegriff als regulären Ausdruck interpretieren
--von DATUM Suchzeitraum ab (inklusive), TT.MM.JJJJ oder JJJJ-MM-
TT
--bis DATUM Suchzeitraum bis (inklusive), TT.MM.JJJJ oder JJJJ-MM-
TT
--datum {buchung,umsatz}
Welches Datum für --von/--bis gilt: buchung (Standard)
oder umsatz
Beispiele:
python kontoanalyse.py x.csv
python kontoanalyse.py x.csv --suche obi --von 01.05.2026 --bis 31.05.2026
python kontoanalyse.py x.csv --suche miete --feld referenz --von 01.01.2026
python kontoanalyse.py x.csv --suche "obi|diskont" --feld name --regex --bis 2026-05-12 --datum umsatz
Der Prompt
Hier ist ein Prompt, der das Ergebnis in einem Durchgang beschreibt. Er enthält die Entscheidungen, die sich erst im Lauf des Gesprächs ergeben haben, etwa die Referenz-Erkennung und dass „Gutschrift“ keine Rückbuchung ist.
Schreibe ein Python-3-Kommandozeilenprogramm `kontoanalyse.py` (eine Datei, nur
Standardbibliothek, Beträge mit Decimal), das einen Kontoauszug-CSV-Export auswertet.
Teste es anschließend mit den Beispielzeilen unten und liefere die Datei aus.
## Eingabeformat
- Semikolon-getrennt, keine Kopfzeile (falls doch eine da ist: automatisch überspringen),
CRLF, Dezimalkomma, Tausenderpunkt. Encoding: erst utf-8-sig, dann cp1252.
- Spalten: Eigene IBAN; Buchungstext; Buchungsdatum; Umsatzdatum (Valuta); Betrag; Währung.
- Daten im Format TT.MM.JJJJ. Zeilen mit zu wenigen Spalten oder ungültigem Betrag
mit Warnung auf stderr überspringen. Bei mehreren Währungen warnen, nicht umrechnen.
- Beispielzeilen (Kartenzahlungen, Backslashes wörtlich):
AT4123420020011944460;Bezahlung Karte MC/000004612|OEAMTC 3145 K002 13.05. 17:42|OEAMTC BADEN 1700\\BADEN\2512;13.05.2026;13.05.2026;-146,90;EUR
AT41142320020011944460;Bezahlung Karte MC/000004611|POS 0724 K002 13.05. 10:10|OBI SAGT DANKE\\BADEN\2500;13.05.2026;13.05.2026;-24,82;EUR
AT412320020011944460;Bezahlung Karte MC/000004610|POS OAT3 K002 12.05. 10:50|DISKONT 8007\\BADEN\2500;13.05.2026;12.05.2026;-49,21;EUR
- Überweisungen enthalten im Buchungstext z. B.
"BAWAATWWXXX AT78142002230012235861 Kalr Maxinger" (optionale BIC, IBAN ohne
Leerzeichen, danach der Name).
## Kategorien (Standardmodus ohne --suche)
Jede Buchung bekommt eine Kategorie, je Kategorie werden Anzahl und Summe gebildet.
1. Rückbuchungen: Enthält der Buchungstext (ohne Beachtung der Groß-/Kleinschreibung)
Rückbuchung (auch Rueckbuchung/Ruckbuchung), Storno, Retoure, Rückerstattung,
Rückzahlung, Rücküberweisung, Chargeback, Refund oder Reversal, ist die Kategorie
"RÜCKBUCHUNGEN". Sie werden nicht mit den Ursprungsbuchungen verrechnet.
"Gutschrift" ist bewusst KEIN Schlüsselwort. Die Liste soll als Konstante leicht
änderbar sein.
2. Sonst Empfänger = Kontobezeichnung: Steht im Text eine fremde IBAN (nicht die eigene),
ist die Kategorie der Name hinter der IBAN (Originalschreibweise, z. B.
"Kalr Maxr"). Der Name reicht bis zum Textende oder bis zu "|" bzw. "\".
Eine beschriftete Referenz im Namen ("Verwendungszweck: ...") wird abgeschnitten.
Ist zu einer IBAN irgendwo in der Datei ein Name bekannt, wird er auch für Buchungen
derselben IBAN ohne Namen verwendet (IBAN->Name-Verzeichnis über die ganze Datei).
Nur wenn nirgends ein Name vorkommt, ist die IBAN selbst die Kategorie.
3. Kartenzahlung (Text mit "|"): Händlername = letztes Segment nach "|", bis zum ersten
Backslash, nachgestellte Zahlen (PLZ/Filialnr.) entfernt, in Großbuchstaben
(z. B. "OEAMTC BADEN", "OBI SAGT DANKE", "DISKONT").
4. Fallback: bereinigter Text, 60 Zeichen, Großbuchstaben.
Ausgabe: Tabelle Kategorie / Anzahl / Summe (deutsches Zahlenformat 1.234,56 plus
Währung), aufsteigend nach Summe sortiert (größte Ausgabe zuerst), darunter GESAMT.
`--export CSV` schreibt dieselbe Tabelle (Semikolon, utf-8-sig).
## Zerlegung jeder Buchung für die Suche
- Konto: fremde IBAN aus dem Text (sonst leer)
- Zielname: wie die Kategorie unter Punkt 2/3, aber unabhängig von "RÜCKBUCHUNGEN"
- Zahlungsreferenz/Überweisungszweck, in dieser Reihenfolge: (a) beschriftet mit
Zahlungsreferenz|Verwendungszweck|Referenz|Zahlungsgrund|Zweck|Ref, gefolgt von ":" oder
"=" (bis "|", "\" oder Zeilenende); (b) bei Überweisungen der Text nach dem Namen
hinter "|" oder "\"; (c) bei Kartenzahlungen die Belegnummer (z. B. MC/000004612)
## Suche (--suche BEGRIFF)
- `--feld konto|name|referenz|alle` (Standard alle). Die Suche ist ein Teilstring-Vergleich
ohne Beachtung der Groß-/Kleinschreibung. Konto-Suche ignoriert Leerzeichen im Begriff.
Ein Name wird nicht im Feld Konto gefunden und umgekehrt.
- `--regex`: Begriff ist ein regulärer Ausdruck (re.search, IGNORECASE). Die Konto
ist ohne Leerzeichen gespeichert. Ungültiger Ausdruck -> verständliche Fehlermeldung,
Exit-Code 1. Ohne --regex bleibt die Suche wörtlich.
- Zeitraum: `--von` und `--bis` (TT.MM.JJJJ oder JJJJ-MM-TT, jeweils optional, beide
Grenzen inklusive), `--datum buchung|umsatz` (Standard buchung = Buchungsdatum,
umsatz = Umsatzdatum aus Spalte 4). Buchungen ohne gültiges Datum fallen bei gesetztem
Zeitraum raus. Ungültiges Datum oder von > bis -> Fehler.
- --feld, --regex, --von, --bis sind nur zusammen mit --suche erlaubt (argparse-Fehler).
- Die IBAN->Name-Zuordnung wird immer über ALLE Buchungen gebildet, die Filter wirken
erst danach.
- Ausgabe: bei Zeitraum eine Zeile "Suche '...' (Feld: ...) | Zeitraum: ... (Buchungsdatum|
Umsatzdatum)". Dann Trefferliste mit Spalten Buchung, Umsatz, Betrag (rechtsbündig),
Konto, Zielname, Referenz, Kategorie (lange Werte mit "…" kürzen, leere Werte als "-"),
darunter "N Treffer". Danach "Kategorien der Treffer:" mit Tabelle Kategorie/Anzahl/
Summe und GESAMT (Rückbuchungen bleiben eigene Kategorie). Keine Treffer ->
Meldung (mit Zeitraum, falls gesetzt).
- `--export CSV` speichert bei der Suche die Treffer (Semikolon, utf-8-sig, Spalten:
Buchungsdatum;Valuta;Betrag;Waehrung;Konto;Zielname;Referenz;Kategorie;Buchungstext).
## Hilfetext
argparse mit RawDescriptionHelpFormatter und diesem Epilog "Beispiele:" (wörtlich):
python kontoanalyse.py x.csv --suche obi --von 01.05.2026 --bis 31.05.2026
python kontoanalyse.py x.csv --suche miete --feld referenz --von 01.01.2026
python kontoanalyse.py x.csv --suche "obi|diskont" --feld name --regex --bis 2026-05-12 --datum umsatz
Ein Modul-Docstring am Dateianfang erklärt Format, Kategorien, Suche und Aufrufe.
## Test
Prüfe mit den drei Beispielzeilen (Summe -220,93 EUR) plus selbst ergänzten Zeilen:
Überweisung mit BIC+IBAN+Name und "|Miete Mai 2026", eine mit "Verwendungszweck: ...",
eine nur mit IBAN (muss dem bekannten Namen zugeordnet werden), eine Storno-Buchung.
Teste alle Suchfelder, --regex, den Zeitraum (inkl. --datum umsatz) und Fehlerfälle.
Hinweise zur Verwendung
Du kannst mit den Beispielzeilen aus deiner Datei weiterarbeiten. Für Überweisungen sind es nur meine Annahmen, echte Zeilen deiner Bank würden die Referenz-Erkennung verbessern.
Wenn du das Ergebnis in einem neuen Chat prüfst, achte auf zwei Stellen, die leicht abweichen können: die Rückbuchungs-Schlüsselwörter und die Händlernamen bei Kartenzahlungen.







