diff --git a/Hermes/iban_tool/iban_csv_converter.py b/Hermes/iban_tool/iban_csv_converter.py new file mode 100644 index 0000000..930e12c --- /dev/null +++ b/Hermes/iban_tool/iban_csv_converter.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +""" +iban_csv_converter.py - Konvertiert eine CSV mit Kontodaten in eine CSV mit IBAN. + +Erwartetes Eingabeformat (Semikolon-getrennt, 12 Felder): +"DE";"00001";" 763910001835904 0021447250";;;76391000;1835904;;;;; + +Feld 6: Bankleitzahl (BLZ) +Feld 7: Kontonummer + +Ausgabedatei enthaelt dieselbe Struktur plus eine zusaetzliche Spalte fuer die IBAN. + +Nutzung: + python iban_csv_converter.py eingabe.csv ausgabe.csv + + # Beispiel mit deinem virtuellen Umfeld: + /home/alin/iban_tool/venv/bin/python /home/alin/iban_tool/iban_csv_converter.py daten.csv daten_m_iban.csv +""" +import argparse +import csv +import sys +from schwifty import IBAN + + +def generate_iban(kontonummer: str, bankleitzahl: str) -> str: + """Erzeugt eine deutsche IBAN aus Kontonummer und Bankleitzahl.""" + try: + bankleitzahl = str(int(bankleitzahl)) # fuehrende Nullen entfernen + except ValueError: + pass + + iban_obj = IBAN.generate("DE", bank_code=bankleitzahl, account_code=kontonummer) + return str(iban_obj) # ohne Leerzeichen, z.B. DE56760614820004594967 + + +def main(): + parser = argparse.ArgumentParser( + description="Konvertiert eine CSV mit Kontodaten (BLZ im 6. Feld) in eine CSV mit IBAN." + ) + parser.add_argument( + "eingabe_datei", type=str, + help="Pfad zur Eingabedatei (CSV mit Semikolon-Separator)" + ) + parser.add_argument( + "ausgabe_datei", type=str, + help="Pfad zur Ausgabedatei (CSV mit zusaetzlicher IBAN-Spalte)" + ) + args = parser.parse_args() + + # Lese die Eingabedatei + with open(args.eingabe_datei, mode="r", encoding="iso-8859-1", newline="") as infile: + reader = csv.reader(infile, delimiter=";", quotechar='"') + rows = list(reader) + + output_rows = [] + for row in rows: + if len(row) < 7: + print(f"Warnung: Zeile hat weniger als 7 Felder, wird uebersprungen: {row}", file=sys.stderr) + continue + + bankleitzahl = row[5] # 6. Feld (Index 5) + kontonummer = row[6] # 7. Feld (Index 6) + + try: + iban = generate_iban(kontonummer.strip(), bankleitzahl.strip()) + except Exception as e: + print(f"Fehler bei BLZ {bankleitzahl}, Konto {kontonummer}: {e}", file=sys.stderr) + iban = "" + + # Erstelle die neue Zeile: Original-Felder + IBAN am Ende + # Behalte das Format bei, fuege IBAN als letzte Spalte hinzu + new_row = list(row) + # Stelle sicher, dass die Zeile genau 12 Felder hat (oder fuege Leerfelder hinzu) + while len(new_row) < 12: + new_row.append("") + # Setze IBAN in das 9. Feld (Index 8) wie im Beispiel ("DE56760614820004594967") + # Falls das Feld bereits existiert, ueberschreibe es + if len(new_row) > 8: + new_row[8] = iban + else: + new_row.append(iban) + output_rows.append(new_row) + + # Schreibe die Ausgabedatei + with open(args.ausgabe_datei, mode="w", encoding="iso-8859-1", newline="") as outfile: + writer = csv.writer(outfile, delimiter=";", quotechar='"', quoting=csv.QUOTE_ALL) + writer.writerows(output_rows) + + print(f"Erfolgreich verarbeitet: {len(output_rows)} Zeilen.") + print(f"Ergebnis gespeichert in: {args.ausgabe_datei}") + + +if __name__ == "__main__": + main() diff --git a/Hermes/iban_tool/iban_tool_windows.zip b/Hermes/iban_tool/iban_tool_windows.zip index d997cea..0550c1b 100644 Binary files a/Hermes/iban_tool/iban_tool_windows.zip and b/Hermes/iban_tool/iban_tool_windows.zip differ