Ich bin kürzlich auf die Herausforderung gestoßen, verschiedene Adresstypen aufzusplitten. Gegeben war immer die Straße und die Hausnummer, allerdings in verschiedenen länderspezifischen Variationen.
Hier eine Datei Datensatz.txt
mit den Straßen:
Thanelstr. 46
Sieglinde-Briemer-Straße 716
Rennerstr. 542a
34, Rue de la Chanson
456 Market Square
Auf der Burg
Auf der Burg 234
90211 Melrost Place, Apt. 1
Hinweis: Benötigt man größere Mengen an Fake-Adressen, dann leistet die Faker-Bibliothek (https://github.com/joke2k/faker) gute Dienste. Mit dem folgenden Python-Code gelingt der Split in Straße und Hausnummer recht gut:
with open('Datensatz.txt', 'rt', encoding='utf-8') as eingabedatei:
for zeile in eingabedatei:
if zeile[-1] == '\n':
zeile = zeile[:-1] # Entferne Zeilenumbruch, falls vorhanden
gesplittet = zeile.split(' ') # Splitte anhand des Leerzeichens
print(gesplittet) # gibt die Liste aus
if gesplittet[-1].isdigit() and gesplittet[0].isdigit():
namensteil = ''
for i in gesplittet[1:]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0], sep = '')
elif gesplittet[-1][0].isdigit() and gesplittet[-1][-1].isalpha():
namensteil = ''
for i in gesplittet[:-1]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[-1], sep = '')
elif gesplittet[-1].isdigit():
namensteil = ''
for i in gesplittet[:-1]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[-1], sep = '')
elif gesplittet[0].isdigit():
namensteil = ''
for i in gesplittet[1:]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0], sep = '')
elif gesplittet[0][0].isdigit() and gesplittet[0][-1] == ',':
namensteil = ''
for i in gesplittet[1:]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0][:-1], sep = '') |
with open('Datensatz.txt', 'rt', encoding='utf-8') as eingabedatei:
for zeile in eingabedatei:
if zeile[-1] == '\n':
zeile = zeile[:-1] # Entferne Zeilenumbruch, falls vorhanden
gesplittet = zeile.split(' ') # Splitte anhand des Leerzeichens
print(gesplittet) # gibt die Liste aus
if gesplittet[-1].isdigit() and gesplittet[0].isdigit():
namensteil = ''
for i in gesplittet[1:]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0], sep = '')
elif gesplittet[-1][0].isdigit() and gesplittet[-1][-1].isalpha():
namensteil = ''
for i in gesplittet[:-1]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[-1], sep = '')
elif gesplittet[-1].isdigit():
namensteil = ''
for i in gesplittet[:-1]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[-1], sep = '')
elif gesplittet[0].isdigit():
namensteil = ''
for i in gesplittet[1:]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0], sep = '')
elif gesplittet[0][0].isdigit() and gesplittet[0][-1] == ',':
namensteil = ''
for i in gesplittet[1:]:
namensteil = namensteil + " " + i
print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0][:-1], sep = '')
Ergebnis:
['Thanelstr.', '46']
Name ist "Thanelstr.", Hausnummer ist 46
['Sieglinde-Briemer-Straße', '716']
Name ist "Sieglinde-Briemer-Straße", Hausnummer ist 716
['Rennerstr.', '542a']
Name ist "Rennerstr.", Hausnummer ist 542a
['34,', 'Rue', 'de', 'la', 'Chanson']
Name ist "Rue de la Chanson", Hausnummer ist 34
['456', 'Market', 'Square']
Name ist "Market Square", Hausnummer ist 456
['Auf', 'der', 'Burg']
['Auf', 'der', 'Burg', '234']
Name ist "Auf der Burg", Hausnummer ist 234
['90211', 'Melrost', 'Place,', 'Apt.', '1']
Name ist "Melrost Place, Apt. 1", Hausnummer ist 90211
Die Lösung ist nicht optimal, besser fährt man sicher mit libpostal und seinen Python-Bindings (https://github.com/openvenues/pypostal)
Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.
Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.
More Posts - Website