Door
Arthur Nolles
op 06-09-2016 18:56
gewijzigd op 06-09-2016 18:58
12.406 views
Hoi,
Ik heb een grote lijst met adressen en telefoonnummers. Die lijst wil ik netjes verwerken en in een mysql database stoppen. Het lastige is dat er een aantal verschillende formaten zijn waarin de adressen worden weergeven. Ik dacht dat ik er met regular expressions uit zou komen, maar mijn kennis daarvan is niet groot genoeg. Graag krijg ik hier wat hulp bij.
Dit zijn de straatformaten:
Rodekruislaan 23
2e Rodekruislaan 23
2e Rode Kruislaan 23
Rodekruislaan 23 B
2e Rodekruislaan 23 B
2e Rode Kruis Laan 23 B
Rodekruislaan 23/C
2e Rodekruislaan 23/C
Rodekruislaan 23C 001
2e Rodekruislaan 23C 001
Rodekruislaan 23 C 001
Rodekruislaan 23 C 001B
etc
Ik wil graag de straat, het nummer en de toevoeging opsplitsen. Tot nu toe heb ik dit:
<?php
if (preg_match('/(?P<straat>.*)\s(?P<nummer>\d*)\s(?P<toevoeging>\w*)$/', $string, $matches)) {
Ik snap niet waarom het nummer afgebroken wordt. Kan iemand mij dat vertellen? En weet jij of er een formaat is waarmee ik alle typen adressen kan formateren? Het kan dus zijn dat een straatnaam meerdere spaties heeft, wat het ook lastig maakt, denk ik. Ook kan het zijn dat de string begint met een nummer, zoals je ziet in de voorbeelden hier bovven.
Alvast super bedankt, ik weet dat dit een lastige vraag is.
Alle cases van de TS worden wel gematcht, maar het blijft inderdaad een drama wat uitzonderingen betreft. Ik denk dat je zoiets in een nette gebruikersinterface moet verpakken die twijfelgevallen markeert voor een menselijke correctie. Bijvoorbeeld alle adresregels met getallen op twee verschillende posities.
Straatnamen vergelijken via een postcode-API is inderdaad ook slim. Eventueel kun je dat nog combineren met een soort spellingcorrectie die alle 'Burg. ' vervangt door 'Burgemeester '.
Neemt niet weg dat het probleem waarschijnlijk is ontstaan doordat je voor het hele adres één invulveld had. Je kunt dan geen onderscheid maken tussen de delen waaruit deze is opgebouwd. Deze wens is er nu blijkbaar?
De enige manier om dit probleem (naar de toekomst toe) op te lossen / te voorkomen is zoals @Ben aangeeft: het introduceren van aparte invoervelden.
Ik snap dat je je invoer die je nu reeds hebt wil fixen maar ik hoop dat dit ook duidelijk maakt dat deze ook soms echt niet klopt. Je moet niet proberen recht te breien wat krom is.
Idealiter heb je dus een mechanisme die al bij invoer kijkt of de informatie klopt. Bijvoorbeeld een autocomplete op grond van huisnummer + postcode. En voor de randgevallen kun je je adres handmatig in- of aanvullen.
Dit alles zodat de informatie die de database ingaat klopt en gestructureerd staat opgeslagen zodat je niet achteraf hier doorheen moet baggeren met allerlei vage regexes om de boel weer te fixen :/.
Het is altijd lekker makkelijk om e.e.a. aan te nemen. Maar zoals ik eerder zei heb ik deze data zo aangeleverd gekregen en heb ik het hier mee te doen - ik was niet degene die de data heeft verzameld. Is inderdaad vervelend, maar geen preek waard. Ik denk dat wat je zegt voor iedereen wel duidelijk was.
Als deze data aangeleverd wordt dan kun je in het vervolg wellicht ook wat kritischer zijn over de vorm waarin dit aangeleverd wordt, anders maak je het op deze manier je eigen probleem waarbij je van een zwik ongestructureerde data iets gestructureerds moet maken.
En als dat ook niet mogelijk is dat loont het wellicht de moeite om eens een balletje op te gooien bij deze partij zodat ze hun eigen informatiehuishouding op orde stellen.
Misschien zit men niet te wachten op dit soort (bijdehante?) opmerkingen. Aan de andere kant, als ik door de luiheid / stupiditeit van anderen meer werk heb, dan zou ik daar iets van zeggen.
Je hoeft niet zomaar alles te accepteren wat over de schutting gegooid wordt.
Een balletje opgooien kan altijd, maar soms kan je er niks aan doen dat het nou eenmaal zo aangeleverd wordt. Niet iedereen is in alles zo efficiënt, en dan moet je roeien met de riemen die je nou eenmaal hebt om toch met omweggetjes de boel fatsoenlijk te kunnen verwerken.
Soms moet je gewoon keuzes maken!
Verder is dit ook niet echt de vraag van de topicstarter, en heeft die ook aangegeven niet anders te kunnen. Dus we kunnen ons maar beter bij deze 'wereldverbetering' neerleggen.
Deze website gaat toch over het oplossen van programmeervraagstukken? Het probleem hier is dat je input ongestructureerde bagger is (of, in ieder geval, er wordt te weinig onderscheid gemaakt tussen de verschillende onderdelen waarin je geinteresseerd bent (straatnaam, huisnummer, toevoeging etc.). De topicstarter is vervolgens op zoek naar een maatwerk oplossing om dit recht te breien).
De enige juiste oplossing is dan ook het repareren van (het aanleveren van) de input. Alle andere oplossingen, hoe goed deze ook werken, zijn symptoombestrijdingen van (lees: ad hoc oplossingen voor) het oorspronkelijke probleem.
Dit is geen wereldverbetering, dit is mensen confronteren met gemaakte keuzen. En proberen te achterhalen of deze beslissingen ergens op gebaseerd zijn. Of dat er uberhaupt is nagedacht over hoe je informatie wilt gaan gebruiken / inzetten.
Niets is zo verkwistend als voortborduren op een slecht ontwerp. Dit is dan ook niet iets wat aangemoedigd zou moeten worden.
EDIT: kan het ergens wel plaatsen dat TS enigszins geagiteerd reageert, niemand vind het immers leuk om andermans rommel op te ruimen. Zeg daar dan ook wat van.
Daarom kan je bij de derde partij een balletje opgooien, en dan afwachten. Anders is het zoals ik net ook al zei, roeien met de riemen die je hebt. Je kan iemand ook niet altijd dwingen om de juiste informatie aan te leveren. Ik heb vroeger ook wel eens ranzige convertertjes moeten maken om data op te halen, en nee dat kon niet anders.
Een discussie over het 'hoe wel/niet aanleveren van adressen en in welk formaat' vind ik niet veel waard in dit topic. Daar mag wat mij betreft een nieuw topic voor worden aangemaakt. De topicstarter heeft immers al aangegeven zijn lijst al zo te hebben, en daar weinig aan te kunnen veranderen.