Jump to content

Straatadres splitsen in straatnaam, huisnummer en toevoeging


Recommended Posts

Als je pakketten wil aanmelden voor verzending bij PostNL via hun API's dan moeten deze gegevens gescheiden worden aangeverd. Heel vaak staat alles echter in één veld en veel webshops leveren het ook in één veld aan.

Het afgelopen weekeinde had ik weer zo'n geval en toen heb ik daar een CF gebakken, die in de meeste gevallen een correct resultaat levert. Alleen wanneer de straat eindigt op een jaartal, wordt het lastig. (Een adres zoals: plein 1940-1945 heb ik hierin opgelost, maar andere gelijksoortige straatnamen denk ik niet)

/* 
################################################################## 
# 
#  AdresSplitsen custom-function
#  Format: 	AdresSplitsen ( StraatHuisnrToev ) 
# 
#  Parameters:
#  StraatHuisnrToev: Straat, huisnummer en toevoeging in één
# 
#  Data returned: 
#  JSON met 3 objecten: street, housenr, addition
# 
#  Description: 
#  Voor het aanmelden van zendingen bij Postnl via hun API moet van alle adressen 
#  de adresregel worden geplitst in de 3 velden street, housenr en addition.
#  Tussen de straatnaam en het huisnummer moet een spatie staan, de toevoeging 
#  mag aan het huisnummer vast zitten. 
#  De functie werkt matig bij straatnamen die eindigen op een jaartal.
# 
#  Author:
#  Menno van Beek
# 
#  20220226 	Initial version
#  
#  ©2022 - FileMakerTips.nl
# 
################################################################## */

Let ( [ 

	aList = Substitute ( 
				TrimAll ( 
					Substitute ( 
						StraatHuisnrToev ; 
						[ "-" ; " " ] ; [ "/" ; " " ] ) ; 
					1 ; 1 ) ; 
			[ " " ;  ] ) ; 
	n = ValueCount ( aList ) ; 
	i = If ( n > 2 ; n - 2 ; 1 ) ; 
	a = Trim ( Substitute ( LeftValues ( aList ; i ) ; [  ; " " ] ) ) ; 
	b = GetValue ( aList ; i + 1 ) ; 
	c = GetValue ( aList ; i + 2 ) ; 
	bn = Filter ( b ; "1234567890" ) ; 
	cn = Filter ( c ; "1234567890" ) ; 
	nn = Case ( Exact ( b ; bn ) and not ( b = 1945 and PatternCount ( a ; 1940 ) ) ; 1 ; 0 ) ; 

	nr = Case ( nn ; b ; Filter ( If ( n > 2 ; c ; b ) ; "1234567890" ) ) ; 
	ex = If ( Length ( nr ) ; Case ( nn ; c ; Substitute ( If ( n > 2 ; c ; b ) ; nr ; "" ) ) ) ; 
	st = If ( IsEmpty ( nr ) ; StraatHuisnrToev ; 
			Trim ( Left ( StraatHuisnrToev ; 
			Position ( StraatHuisnrToev ; " " & nr ; Length ( nr & ex ) + 2 ; 1 ) ) ) ) ; 
	
	nr2 = Case ( IsEmpty ( st ) ; ex ) ; 
	nr = Case ( IsEmpty ( nr2 ) ; nr ; Filter ( nr2 ; "1234567890" ) ) ; 
	ex = Case ( IsEmpty ( nr2 ) ; ex ; Substitute ( nr2 ; nr ; "" ) ) ; 
	st = Case ( IsEmpty ( nr2 ) ; st ; 
			Trim ( Left ( StraatHuisnrToev ; 
			Position ( StraatHuisnrToev ; " " & nr ; Length ( nr & ex ) + 2 ; 1 ) ) ) ) ; 
 	
	result = JSONSetElement ( "" ; 
				[ "street" ; st ; JSONString ] ; 
				[ "housenr" ; nr ; JSONString ] ; 
				[ "addition" ; ex ; JSONString ] )

] ; 

	result

)

 

Link to comment

Met enige regelmaat krijg je met dit probleem te maken, niet alleen bij de PostNL API's. Dus fijn dat jij deze CF met ons deelt.

Bij PostNL is mijn ervaring trouwens dat je de huisnummertoevoeging gewoon leeg kunt laten en aan het huisnummer vast kunt laten zitten. Belgische adressen zijn weer een tikkie lastiger vanwege de gewoonte van de Walen om het huisnummer vooraan te zetten. En zo wordt in Luxemburg met regelmaat geen huisnummer vermeld. Een streepje voldoet dan voor de API en het pakketje komtook dan eigenlijk altijd wel aan. 😁

Edited by Banach
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...