#!/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__": try: main() except Exception as e: print(f"\\nFEHLER: {e}", file=sys.stderr) print("\\n details:", file=sys.stderr) import traceback traceback.print_exc() finally: # Fenster offen halten, damit der Benutzer den Fehler oder die Bestaetigung lesen kann input("\\n--- Fertig (Enter zum Schließen) ---")