Powershell/Hermes/iban_tool/iban_csv_converter.py

95 lines
3.2 KiB
Python

#!/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()