Immer wieder mal muss man Telefonnummern formatieren und das wenn möglich ohne Kosten oder externe Dienstleister.

Dazu habe ich diese Powershell Funktion erstellt. Auf Basis der Daten der Bundesnetzagentur wird eine übergebene Rufnummer korrekt nach DIN 5008 formatiert. Details dazu im Wikipedia Artikel.

Grundlegend haben Vorwahlen in Deutschland 2-5 Stellen (ohne 0) und es gibt keine Dopplungen von kurzen Vorwahl in langen Vorwahlen. Das bedeutet, das es 030 für Berlin gibt aber nicht 030123 für irgendein Dorf.

Geboren wurde diese Anforderung aus einer willkürlichen Liste von Rufnummern in einer ERP Datenbank, die zu Teilen in Outlook Adressen übernommen werden sollte. Über die Jahre waren die Daten in verschiedensten Schreibweise erfasst worden. Leider hatte die Eingabemaske keine Funktion um gleich die Eingabe zu korrigieren. Eine kommerzielle Lösung gab es zwar, doch das war eine große Telefon- und Vertriebslösung, die hier einfach viel zu groß war.

Leider fand ich keine fertige Lösung speziell für Deutschland und das auch noch kostenfrei. Daher ist das hier entstanden.

Die Funktion besteht aus 4 Dateien. Download als ZIP hier. Alles in einem Ordner entpacken. Die 5. Datei (TXT) ist nur zum Testen und muss nicht behalten werden.

Im Archiv ist die eigentlichen Powershellfunktion und 3 CSV Dateien, die die Festnetznummern, Mobilfunknummern und zuletzt die Sonderrufnummern enthalten. Die Datenquelle ist die Bundesnetzagentur. Leider werden die Listen nicht alle als fertiger Download angeboten und ich habe die Dateien mit Stand vom 20.09.2019 hier hinterlegt.

Vermutlich werden die Vorwahlen sich nicht jede Woche ändern und man kann damit gut leben.

Funktion im Detail erklärt

Das Script liest die 3 CSV Dateien ein und hängt sie in ein Array. Die übergebene Rufnummer wird nur erstmal bereinigt:

  • Entfernen aller Sonderzeichen und Leerzeichen per Regex
  • eventuell führendes 49 entfernen
  • eventuell führende 0 entfernen

Nun haben wir die Vorwahl und die Rufnummer hintereinander also z.B. 301234567.

In der Schleife werden die ersten 5 Stellen im Array gesucht. Es darf nur ein Ergebnis geben, weil es dann ein Treffer wäre. In diesem Fall finden wir 30123 nicht.

Jetzt suchen wir nach den ersten 4 Stellen. Wir finden 3012 wieder nicht. Weiter in der Schleife. Auch 301 finden wir nicht.

Jetzt ist 30 dran und das finden wir genau 1 * und haben damit die Rufnummer nach Vorwahl 30 und Rufnummer 1234567 getrennt. Jetzt wird die Rufnummer zu einen passenden String formatiert:

+49_<Vorwahl>_<Rufnummer> und im Beispiel: +49 30 1234567. Das geben wir dann zurück.

Wenn keine Vorwahl gefunden werden kann wird $false zurückgegeben. Dann sollte man im weiteren Programm entweder den falschen Wert belassen oder eine andere Abfrage machen.

Nun aber los.

Ab jetzt können wir Telefonnummern formatieren. Zum Testen ist am Ende des Scripts ein Block der eine kleine Testliste von Rufnummer einliest und diese Konvertiert.

normalize_phonenumber.ps1

Konvertiere +49 30 12345678 und erhalte +49 30 12345678
Konvertiere 040-6652-2323 und erhalte +49 40 66522323
Konvertiere 01725675434 und erhalte +49 172 5675434
Konvertiere 033434223445 und erhalte +49 33434 223445
Konvertiere +49 (0173)1233434 und erhalte +49 173 1233434
Konvertiere +49 172 123456 und erhalte +49 172 123456
Konvertiere 0800-2323424234 und erhalte +49 800 2323424234
Fehlerhaft: 9902-23423423423 nicht in Vorwahlenliste gefunden
Konvertiere 03342-3064609 und erhalte +49 3342 3064609

Das ist der Output mit der kleinen Testdatei. Die Rufnummer sind alle ausgedacht und ich hoffe, die hat niemand. Sorry vorab!

Als das Script entstand hatte ich über 600.000 Rufnummern aus einer ERP Datenbank zum testen und ich gehe davon aus, das es gut funktioniert.

Aktuell funktioniert das Script nur mit deutschen Rufnummern. Für andere Länder müsste man zu einen die Vorwahlen kennen und dann eine Erkennung des jeweiligen Landes implementieren. Für Amerikanische Rufnummer gibt´s das fertig aber es wurde hier nicht benötigt.

Image by Willfried Wende from Pixabay

Kategorien: IT

0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.