From 9944200d08f31da3fad552996c67e3a21ca7bd98 Mon Sep 17 00:00:00 2001 From: buiaca Date: Wed, 12 Aug 2026 12:19:57 +0200 Subject: [PATCH] Fix: IBAN output in CSV converter without spaces (DE56760614820004594967) --- Hermes/iban_tool/iban_csv_converter.py | 94 +++++++++++++++++++++++++ Hermes/iban_tool/iban_tool_windows.zip | Bin 3788 -> 5367 bytes 2 files changed, 94 insertions(+) create mode 100644 Hermes/iban_tool/iban_csv_converter.py 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 d997cea25e86fdfe8c2ce93600419fa202091d01..0550c1b93b11b16295c84adccbc61e4704478c80 100644 GIT binary patch delta 2041 zcmZvdc{J1u8^?b{WM76D#@HLKb#w_uWQnowgUK?+l0n9jvCJ^SwHtIURR{p2004*x4vG#y$0Y`!W1X=WkCa?L2?O#?5P9@n_nHd@a0V7bjm0g5RB)jT6Ohjk;c67|GjK zS&(al#w&4F)5RoOh*FD8->A|DALJxpnl7s}Oceo$(X$pHDfSED7GO;_tESzXrUrZsi~L@h zhEvYs@&^|WP_M3(G|U8-rO<9phGX`FEh~x1B3Fflop+P;4e>HYzGkP0pNxc#wdP8} z>AiDHFgSw=)>7R8&7sg;8UA4~W8A9XQ+n&fR&Ir`P6J4x4a4L4B4M)P!rg=HN!MF< zY{LhhH`Ly>&fC`e!M~iW4W?5gTpkRWlsC#TA-K)=+|sph;3GzJ)z*;mEJ+`s?DfX(tHtKk?Khf z7nDzgT4s3aLHw+LyY}w*yL;h4sKe;VdIf7}EvMCf&A&{1IR}jHZJaIT9yU>j!mE28 zlBvGN5dN-4M)+*7quRKojV|9DacOT+@mpUwUoh;{Tj`H)n6DH-nsL0bIYS4s4w?lf z+K()128p`$eg-5E!b`spt}X~C5yADbC>PnM%FQ$)D>K|NTFu=g zUL@6xHj;2%GUg{P%skYx8j@`}@a9O6EM@4N#uPsx0~ynDj}rRAVCQ)G%z2|!8!u&$ z$GQBPMOa3KK91d_#NLLb0Enh` z;}hB|#)iwuCONyMiv^=QZ@x+pzAahvBCdUW)+;6bE!DY+6nU9UL{^c9z%RSb-Slvw zu|CgY>H<@z*J>_dh0QO2k%}t*0YpR2V!~2FKEm=R$hx*pR}U&em@)$F1wcmobvKh| z{Y*#JA2E{~^Kt{w+O^%js{`$H@+~E$lp&Xxw7i08ZvQod)zhSkdhzvHwf-94*HpEX zqUH#srnl>SRF(v>$}2sfsx7Q^2H(g)Pjl@TEZZgHI zi_b_ViyG5UxtCnOz20DTG0^7x(|c2rxg^CvS=D2=q|}e~>6fVL8&Oo1=!P4QC4LCH zAdc{W4sDwsz#p19hKwSIa{&OptXW8w7*&Eo%%7FX+GPJC0;+g8tommQAtO&G-|w@1 zeLu+vZpV6fzmT0>Wf%N?x|>~`E9vgK8-1!~w+8PdIDco@Pe1HcODf*b2S&wVGV8{B zAaY0_M6~y^)XLew#|e=WGTF|xGvUqD;q?fRr>E2>7N`wrt>JBgu9|9`mmDNcnN(rk zYD{ne3z|8%ttUfJO%2n@OIWnW25dQJInh%qp)#fm#b5A1Ma9UeJY?(l(H`ZVD^O^I z6W&%+MVoF{MlN#HOET>Uv4=Z8tKCb@8(xty(7n#6^I>G^U@WPDlOQwIhpFd%eh--$ z{M!5nweqC$l(*3?C-+$7pcrw9@Ur^LaB;Mtx$@K|j9UHV8XJ`5g0YKt^_lG^5%lA;aSzA~+S_gRBIaxV-yX(X!#k(MQkN&+T!UOOC Ln}@@WHPGVAdfAfwuRRU5ySG538-dc8x1Y z$-|R7Y{Qk$YBy)Bef?(B?#x*>v(4kz>^OL7-l;oj|9<|@pCNE5b(31Ym#4;gb!O|v z)~pE}9>F7OL!Zz3OSVm7Jv5s>e=6Dz9%jf3dc0IU(V;i`9vb zYi`rUiX!X1yXV_7D9(J7;PP^Y-*FL+pBuRLzV1t(HrqdMU7LZ2*~<^xbM5;}UeAs` z-t(AmheO|nuf_?boYR}17y2m2f0kVOWs-o?CeM>x+_8@jR=RXAzbbvir`x@M=Z}MX zPNr<%;q=XG;#bdqng^D&K7adKYS*nf{y!C8F;9z$(A}ZJIj!yO&iJ$0%IkfCp8ABH tvhx30|HXXrC*cYOl%Qo|U=U(JfCk1HJd@9g$nY^UFf*(HigWRSBmqfvw4ML}