Parsowanie adresu pocztowego

0

Witam.
Piszę właśnie aplikację do importu danych z jednego systemu do drugiego.

W jednym systemie mam tablicę w postaci:
imię
nazwisko
adres
kod pocztowy
miasto

W drugim systemie tablica ma postać:
Imię i nazwisko
ulica
nr domu
nr mieszkania
kod pocztowy
miasto

Problem jest następujący: Jak automatycznie podzielić adres w postaci np:
ul. Kasztanowa 6/7 (a czasami al. Lipowa 7m4 albo tak, jak akurat się ludziom wpisało)
na części (numer domu, mieszkania, ulica)? Nie chodzi mi o techniczną stronę, bo nie w tym leży problem - chodzi mi raczej o samą ideę algorytmu takiego podziału :).

0

od początku do 1 cyfry to jest nazwa ulicy potem nr domu do '/' lub 'm', a potem do końca linii nr mieszkania

0

@winerfresh, nigdy nie widziałeś nazwy ulicy zaczynającej się od cyfry ? np. ul. 3 Maja. Cyfry po literach też nie muszą oznaczać końca nazwy - w Poznaniu jest ulica 28 czerwca 1956 roku
W adresie ul. Poziomkowa 3/4, 4 może być numerem mieszkania, a może być że posesja ma numer 3/4.
IMO bezbłędny podział jest niemożliwy.

0

Co w przypadku: Wielka Wies 15? W adresie masz wpisane 15?

Jak dla mnie to przygotuj sobie parsowanie standardowej postaci, najbardziej powszechnej. Reszte ktos musi przejrzec i zdecydowac jaka to postac.

0

Najlepiej to zacząć od końca. Ostatnia liczba (wszystkie stojące jedna za drugą cyfry idąc od końca) - albo numer lokalu albo numer domu.
Idziemy dalej. Jeśli przed ostatnią liczbą (ignorując spacje) stoi separator w postaci "/", "", "m" lub "m." to wiemy że ta ostatnia liczba jest numerem lokalu, a liczba przed separatorem to numer domu, czyli znowu ignorujemy spacje i czytamy cyfry, ale tym razem muszą być poprzedzone spacją. Jeśli przed separatorem nie znajdziesz liczby lub nie będzie ona poprzedzona spacją to adres jest błędny. Jeśli nie znajdziemy separatora to mamy tylko numer domu. Cała reszta to nazwa ulicy / wsi.

Separator "m" musi być poprzedzony spacją lub cyfrą. Inaczej nie jest separatorem.
Na wstępie odrzuć spacje z początku i końca łańcucha.

Jak ktoś znalazł jakiś luki niech napisze.

0
adf88 napisał(a)

Jak ktoś znalazł jakiś luki niech napisze.

Zacząłem sprawdzać Twoją metodę dla prawdziwych adresów z mojej bazy.

Dotarłem do 35 adresu - metoda nie zadziała dla:
ul.Mickiewicza 4 lok.18
Kętrzyn 26 A
ul.Jaracza 1/3 blok 16

Chyba w ogóle nic z tego. Użytkownicy i rzeczywistość są nieprzewidywalni :)

Z piękniejszych kwiatków z mojej bazy:
os. 25-lecia PRL 10-12/6
pl.Czerwca 1976 r. nr.14
ul.Jana Olbrachta 118 ABCD

1
yakhub napisał(a):
adf88 napisał(a)

Jak ktoś znalazł jakiś luki niech napisze.

Zacząłem sprawdzać Twoją metodę dla prawdziwych adresów z mojej bazy.

Dotarłem do 35 adresu - metoda nie zadziała dla:
ul.Mickiewicza 4 lok.18
Kętrzyn 26 A
ul.Jaracza 1/3 blok 16

Chyba w ogóle nic z tego. Użytkownicy i rzeczywistość są nieprzewidywalni :)

Z piękniejszych kwiatków z mojej bazy:
os. 25-lecia PRL 10-12/6
pl.Czerwca 1976 r. nr.14
ul.Jana Olbrachta 118 ABCD

Yakhub, Metoda podana przez adf88, parsowania "od końca" działa bardzo dobrze (dokonałem kilku korekt dotyczących separatora "blok-mieszkanie".

Dla wszystkich, którzy pracują nad parsowaniem adresów proponuję połączyć metodę zaproponowaną przez adf88 z parsowaniem od początku adresu. Jeśli algorytmowi nie uda się sparsować adresu "od początku" to próbuje sparsować "od końca" (zaproponowane przez adf88). Jeśli dwa sposoby nie dadzą rady sparsować tzn. że adres jest po prostu źle napisany, błędny.

Napisałem ww. algorytmy parsowania i adresy z Twojej bazy danych parsuje bardzo dobrze w następujący sposób:

ul.Mickiewicza 4 lok.18 >>> Dom=4 Separator=lok. Mieszkanie=18

Kętrzyn 26 A >>> Dom=26 A

ul.Jaracza 1/3 blok 16 >>> Adres źle napisany. Co w tym adresie jest numerem domu/bloku ???? Nawet normalny człowiek tego nie wywnioskuje.

os. 25-lecia PRL 10-12/6 >>> Adres źle napisany. Tutaj to samo co powyżej. Co jest numerem bloku 10-12? Bzdura.

pl.Czerwca 1976 r. nr.14 >>> Dom=14

ul.Jana Olbrachta 118 ABCD >>> Adres żle napisany. Co to jest ABCD? Pięć klatek schodowych? Błędny adres.

Tak więc podsumowując, zaproponowany przez adf88 algorytm parsowania "od końca" jest sensowny i działa (po dokonaniu kilku korekt dotyczących separatorów). Bardzo dobrze sprawdza się z parsowaniem "od początku" i 99.9% adresów parsuje poprawnie. Reszta to po prostu źle napisane adresy, które nie mają sensu.

Miłego kodowania

3

Automatycznie trudno jest podzielić adres, bo polskie adresy wykazują daleko idącą fantazję.

Przykładowo, ulica XYZ 7/9 - 9 to wcale nie jest numer mieszkania, a numer budynku "od 7 do 9" - zajmuje on sąsiednie działki i taką numerację otrzymał.

Albo inna ulica, nr 10/1 i 10/2 - 1 i 2 to też nie numery mieszkań, a części bliźniaka. Czyli powinny trafić w pole "nr domu".

W małych miejscowościach, które nie mają nazwanych ulic jest po prostu numer domu. Np. Kiwaczkowo 78, 62-123 Kraczkowo. Bywają rzadkie przypadki, że jest adres opisowy, bo budynek nie posiada ani ulicy ani numeru (np. jakaś leśniczówka).

Tego typu operacje zwykle przeprowadza się na bazie tzw. profilu adresowego czyli po prostu wzorca opisującego formaty adresu w danym kraju.
Jak bardzo tego potrzebujesz, to poszukam, bo gdzieś to miałem dla różnych krajów, w tym Polski.

1 użytkowników online, w tym zalogowanych: 0, gości: 1