zur Übersicht nächste Seite

Programmfenster BLZ und BIC

Die Ausführungen der vorherigen Seiten über Programmfenster werden hier weitergeführt.
Generell gilt bei den weißen Textstellen auf dieser Seite: Man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Terminals ein - dann drückt man die Eingabetaste. 
Oder man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Editors ein.  
Dann drückt man zum Abspeichern gleichzeitig Strg und O 
dann drückt man die Eingabetaste um den Dateinamen zu bestätigen 
dann drückt man zum Verlassen des Editors gleichzeitig Strg und X.

Man kann unter der folgenden Adresse

https://www.bundesbank.de/de/aufgaben/unbarer-zahlungsverkehr/serviceangebot/bankleitzahlen/download-bankleitzahlen-602592

die aktuellen Bankleitzahlen herunterladen als reine Textdatei z.B. mit dem Namen 
Bankleitzahlen.txt
in dem Ordner ~/Bla
Es soll nun gezeigt werden wie man über das Terminal (das man im Ordner ~/Bla öffnet) diese schon etwas umfangreiche txt-Datei bearbeiten kann um von einer vorgegebenen Bankleitzahl zu der entsprechenden BIC zu gelangen. Sicherlich kann man diese Datei mit einem Textprogramm öffnen und die Suchfunktion nutzen aber hier sollen Gedanken zum Terminal beschrieben werden. Dabei werden Terminal-Befehle wie Bausteine benutzt, überwiegend solche für sed. Eine schöne Liste dazu ist zu finden unter

http://sed.sourceforge.net/sed1line_de.html

Zunächst muß man die Bearbeitung der Datei durch das Terminal ermöglichen. Öffnet man diese Datei mit gedit und sucht nach
08294Lößnitz
so erhält man das Ergebnis.

Sucht man im Terminal mit grep
grep 08294Lößnitz Bankleitzahlen.txt
so erhält man kein Ergebnis. Eingabe im Terminal
cat Bankleitzahlen.txt
zeigt das Problem

Umlaute sind anders codiert und daher nicht zu identifizieren. Man kann sich die Codierung anschauen
file Bankleitzahlen.txt
Bankleitzahlen.txt: ISO-8859 text, with CRLF line terminators

Man kann die Datei Bankleitzahlen.txt mit gedit öffnen und bei
Seichern unter 
kann man andere Codierung und anderes Zeilenende wählen. Also speichert man diese Datei unter BLZ.txt in dem Ordner ~/Bla ab und das Terminal bleibt weiterhin im Ordner ~/Bla geöffnet

Kontrolle
file BLZ.txt
BLZ.txt: UTF-8 Unicode text

Und jetzt werden die Umlaute gefunden
grep 08294Lößnitz BLZ.txt
870540002Erzgebirgssparkasse 08294Lößnitz Erzgebirgssparkasse 58791 20056502U000000000
870962142Volksbank Chemnitz 08294Lößnitz Volksbank Chemnitz 98040 06056347U000000000

Es soll nach der BLZ gefiltert werden und die zugehörige BIC bestimmt werden, z.B.
grep 50852553 BLZ.txt
Die Ausgabe ist recht umfangreich mit vielen Leerzeichen und etlichen Zeilen. Aber man erkennt daß die letzte durch ein Leerzeichen getrennte Zeichenfolge die gesuchte BIC enthält. Also sucht man einen sed-Baustein der die letzte Zeichenfolge jeder Zeile heraussucht, getrennt durch das Trennzeichen LEERZEICHEN.
grep 50852553 BLZ.txt | sed 's/^.* //'
55053HELADEF1GRG00007554U000000000
00005166U000000000
00005187U000000000
00005900U000000000
00006034U000000000
00007292U000000000
00007334U000000000
00007340U000000000
00007543U000000000
00007575U000000000
00007583U000000000
00008058U000000000
00008077U000000000
00008300U000000000

Die BIC ist hier nur in der ersten Zeile enthalten und es gibt nach der BIC noch 18 weitere Zeichen. Also sucht man einen sed-Baustein der die letzten 18 Zeichen jeder Zeile löscht
grep 50852553 BLZ.txt | sed 's/^.* //' | sed -r 's/.{18}$//'
55053HELADEF1GRG







Es gibt eine Menge von Leerzeilen. Also sucht man einen sed-Baustein der Leerzeilen löscht
grep 50852553 BLZ.txt | sed 's/^.* //' | sed -r 's/.{18}$//' | sed '/^$/d'
55053HELADEF1GRG

Jetzt sucht man einen sed-Baustein der die ersten 5 Zeichen löscht
grep 50852553 BLZ.txt | sed 's/^.* //' | sed -r 's/.{18}$//' | sed '/^$/d' | sed -r 's/^.{5}//'
HELADEF1GRG
Damit hat man die BIC zur BLZ 50852553 bestimmt.

Bei allen diesen letzten Eingabe-Befehlen wurde immer die ganze BLZ-Datei durchsucht. Sicherlich ist ein Computer schnell aber trotzdem ist es vorteilhaft dem Computer etwas Arbeit abzunehmen. Man kann die Durchsuchung der BLZ-Datei für eine bestimmte BLZ nur eimal durchführen und das Ergebnis in eine Variable schreiben. Anschließend wird nur noch die Variable durchsucht oder bearbeitet.
einGABE=$(grep 50852553 BLZ.txt)
Außerdem kann man diese Variable auch durch ein zenity-Eingabefenster erzeugen, in das man dann z.B. 
50852553
eintippt.
einGABE=$(grep $(zenity --entry --ok-label "EINGABE" --title "EINGABE-FENSTER" --text " Bitte BLZ eingeben") BLZ.txt)

Aufruf der Variablen
echo "$einGABE"
Dann schreibt sich die BIC-Suche für 50852553 so
echo "$einGABE" | sed 's/^.* //' | sed -r 's/.{18}$//' | sed '/^$/d' | sed -r 's/^.{5}//'
HELADEF1GRG

Nun gibt es seltene Fälle bei denen das letzte Leerzeichen nicht zur gewünschten Abtrennung des BIC-Blockes führt
grep 13070000 BLZ.txt | grep Ribnitz | sed 's/^.* //'
Ribnitz-Damgt27707DEUTDEBR13663046187U000000000

Deshalb ist das Löschen der ersten 5 Zeichen hier nicht sinnvoll. Man könnte generell anders vorgehen: 
Man erzeugt die Variable
einGABE
und benutzt die sed-Bausteine
die letzten 18 Zeichen jeder Zeile löschen
alles löschen bis auf die letzten 11 Zeichen
Leerzeichen löschen
Leerzeilen löschen

Hier für die BLZ 50852553

echo "$einGABE" | sed -r 's/.{18}$//' | sed -r 's/.*(.{11})/\1/' | sed 's/ //g' | sed '/^$/d'
HELADEF1GRG

Aber auf diese Weise funktioniert es nicht immer. Hier eine andere BLZ:
einGABE=$(grep 54670024 BLZ.txt)
Mit der Variablen einGABE erzeugt durch 54670024:
echo "$einGABE" | sed -r 's/.{18}$//' | sed -r 's/.*(.{11})/\1/' | sed 's/ //g' | sed '/^$/d'
DEUTDEDB546
DEUTDEDB552
DEUTDEDB548

Filtern lediglich nach der BLZ 54670024 zeigt daß es verschiedene Orte gibt
echo "$einGABE"

Der Name der Bank und die Namen der Orte enthalten Leerzeichen in unterschiedlicher Menge so daß das Trennzeichen LEERZEICHEN nicht sinnvoll verwendet werden kann. Aber einzelne Sinnblöcke sind durch mehrfach hintereinanderstehende Leerzeichen getrennt. Also verwendet man sed um 2 Leerzeichen in ein sonst nicht vorkommendes Trennzeichen # zu verwandeln. Anschließend verwendet man noch einen Baustein der mehrfach vorkommende Trennzeichen # in ein einzelnes # verwandelt
echo "$einGABE" | sed 's/  /#/g' | tr -s '#'

Nun stehen die Orte im 2. Feld, getrennt durch das Trennzeichen #. Also verwendet man einen cut-Baustein der dieses Feld heraustrennt 
echo "$einGABE" | sed 's/  /#/g' | tr -s '#' | cut -f 2 -d '#'
67433Neustadt an der Weinstraße
67085Bad Dürkheim
76829Landau in der Pfalz

Nun sollen diese Orte einem zenity-Fenster übergeben werden damit eine Wahlmöglichkeit besteht. Es wird ein radiolist-Fenster gewählt:
zenity --list --text "Beispiel" --radiolist --column "Anklicken" --column "Ort" false A1 true A2 false A3

Die beispielhaften Orte A1 A2 A3 benötigen eine durch Leerzeichen getrennte vorangestellte Eigenschaft false (leerer Auswahlkreis) oder true (im voraus markierter Auswahlkreis). Daher dürfen die Orte keine Leerzeichen enthalten denn sonst würde die Zuordnung der vorangestellten Eigenschaft nicht mehr funktionieren. Es werden 3 Bausteine benutzt
Leerzeichen werden durch Unterstriche ersetzt
Eigenschaft false wird vorangestellt
alles wird in eine Zeile geschrieben.

Es wird auch gleich eine Variable erzeugt:
yA=$(echo "$einGABE" | sed 's/  /#/g' | tr -s '#' | cut -f 2 -d '#' | sed 's/ /_/g' | sed 's/^/ false /g' | tr -d '\n')
Aufruf der Variablen
echo "$yA"
false _67433Neustadt_an_der_Weinstraße false _67085Bad_Dürkheim false _76829Landau_in_der_Pfalz

Dann wird diese Variable an das zenity-Fenster verfüttert, wobei gleich wieder eine neue Variable erzeugt wird
sTA=$(zenity --width 600 --height 300 --title "Details zur BIC-Bestimmung" --list --text "Es gibt mehrere Städte zur Auswahl" --radiolist --column "Anklicken" --column "Ort" $yA )

Angenommen es wurde die oberste Möglichkeit gewählt. Aufruf der Variablen
echo $sTA
_67433Neustadt_an_der_Weinstraße

liefert die ausgewählte Stadt mit Unterstrichen statt Leerzeichen. Daher werden die Unterstriche wieder in Leerzeichen verwandelt und eine weitere Variable gebildet
sTADT=$(echo $sTA | sed 's/_/ /g')
Aufruf der Variablen
echo "$sTADT"
67433Neustadt an der Weinstraße

Nun wird nach der BLZ und auch nach der Stadt gefiltert
echo "$einGABE" | grep "$sTADT"

546700241DB Privat- und Firmenkundenbank (Deutsche Bank PGK) 67433Neustadt an der Weinstraße DB PFK (Deutsche Bank PGK) 21198DEUTDEDB54663050170U000000000

Damit liegt wieder der anfangs beschriebene einzeilige Zustand vor und man kann die obigen Bausteine (ohne Löschung von Leerzeichen und Leerzeilen) benutzen. Am besten gleich in eine Variable schreiben
blZZ=$(echo "$einGABE" | grep "$sTADT" | sed -r 's/.{18}$//' | sed -r 's/.*(.{11})/\1/')
Die anfangs eingegebene BLZ kann man als Variable wiedergewinnen durch (sed-Baustein: alles löschen bis auf die ersten 8 Zeichen)
blZ=$(echo "$einGABE" | grep "$sTADT" | sed -r 's/(.{8}).*/\1/')
Nun werden Variablen an ein zenity-Info-Fenster übergeben
zenity --info --width="280" --title="Eingabe der BLZ $blZ" --text "Die BIC für den Ort \n\n $sTADT \n\n $blZZ"

Nun braucht man nur noch alles in ein script zu schreiben. Dabei wird untersucht wieviele Zeilen bei der BIC-Bestimmung erzeugt werden. Mit
wc -l
läßt sich die Anzahl der Zeilen bestimmen.
nano ~/Bla/blz-BIC.sh
Eingabe in den Editor
#!/bin/bash

einGABE=$(grep $(zenity --entry --ok-label "EINGABE" --title "EINGABE-FENSTER" --text " Bitte BLZ eingeben") BLZ.txt)

if [ $? -eq 1 ]; then

exit

fi

yK=$(echo "$einGABE" | sed -r 's/.{18}$//' | sed -r 's/.*(.{11})/\1/' | sed 's/ //g' | sed '/^$/d')

szZW=$(echo "$yK" | wc -l)

if [ "$szZW" = 1 ]; then

blZ=$(echo "$einGABE" | grep "$yK" | sed -r 's/(.{8}).*/\1/')

zenity --info --width="280" --title="Eingabe der BLZ $blZ" --text "Die BIC ist \n\n $yK"

else

yA=$(echo "$einGABE" | sed 's/  /#/g' | tr -s '#' | cut -f 2 -d '#' | sed 's/ /_/g' | sed 's/^/ false /g' | tr -d '\n')

sTA=$(zenity --width 600 --height 300 --title "Details zur BIC-Bestimmung" --list --text "Es gibt mehrere Städte zur Auswahl" --radiolist --column "Anklicken" --column "Ort" $yA )

if [ $? -eq 1 ]; then

exit

fi

sTADT=$(echo $sTA | sed 's/_/ /g')

blZZ=$(echo "$einGABE" | grep "$sTADT" | sed -r 's/.{18}$//' | sed -r 's/.*(.{11})/\1/')

blZ=$(echo "$einGABE" | grep "$sTADT" | sed -r 's/(.{8}).*/\1/')

zenity --info --width="280" --title="Eingabe der BLZ $blZ" --text "Die BIC für den Ort \n\n $sTADT \n\n $blZZ"

fi
Nun muß man das script ausführbar machen
chmod +x ~/Bla/blz-BIC.sh
Die Datei BLZ.txt und das script blz-BIC.sh müssen im gleichen Ordner liegen.

Trotzdem kann es vorkommen daß für einen Ort keine passende BIC gefunden wird.


zur Übersicht nächste Seite

Datenschutzerklärung
Impressum