Fix: IBAN output in CSV converter without spaces (DE56760614820004594967)
This commit is contained in:
parent
2506199c5f
commit
9944200d08
94
Hermes/iban_tool/iban_csv_converter.py
Normal file
94
Hermes/iban_tool/iban_csv_converter.py
Normal file
@ -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()
|
||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user