Join Now

Juletip #19 Adresse validering ved hjælp af filename URL

by SAS Employee MichaelLarsen on ‎12-18-2014 03:30 PM (311 Views)

Hej!


I dette juletip vil jeg gerne demonstrere hvordan man kan bruge et offentligt API til at få valideret adresser med.

API'et bliver stillet til rådighed for både private og virksomheder af ministeriet for by, bolig og landdistrikter.


Jeg har anvendt URL access engine direkte i infile statementet så jeg kan have et vilkårligt antal forespørgsler baseret på en input tabel.

Hvis adressen findes i opslaget returnerer den en header linie og en eller flere linier med adresser som matcher forespørgslen.

Formatet er svarende til en komma separeret fil med en første linie som header der beskriver hvilke kolonner der returneres, derefter følger, hvis der er match,

en eller flere linier med adresse information, samt information om kommunekode, ejerlav, kortkoordinater, regionskode, politikredskode mv.

I mit eksempel søger jeg efter eksakte adresser, men man kan også komme med mindre eksakte adresser og den vil så returnere alle adresser der matcher

søgekriteriet.

Læs mere om mulighederne på http://dawa.aws.dk


Det forventes at tegnsættet i forespørgslen er UTF-8 og det var lidt af en udfordring at få til at virke når min SAS session kører med Latin 1 tegnsæt.

Det lykkedes dog ved hjælp af et format at få det konverteret.

Man kan jo også se koden som et eksempel på hvordan man kan anvende infile statementet til dynamisk at indlæse data fra en hel række filer.

Glædelig jul!

/************************************************************************************************************

* Danmarks Adressers Web API - DAWA

* http://dawa.aws.dk

* ”Indeholder oplysninger fra Ministeriet for By, Bolig og Landdistrikters Adresse Web Services (AWS).”

************************************************************************************************************/

/************************************************************************************************************

* Indlæs adresser der skal valideres

************************************************************************************************************/

data adresser;

  LookupID + 1; /* Generer et ID så vi senere kan koble opslaget sammen med en adresse */

  length vej $200 husnr $30 etage $30 postnr $10 by $100 distrikt $100 request $1000;

  infile datalines dlm=',' missover;

  input vej husnr etage postnr by distrikt;

/************************************************************************************************************

  * Her samles parametrene i en request variabel som anvendes i det efterfølgende data step

************************************************************************************************************/

  /* Nationale karakterer i vejnavn skal oversættes til UTF-8 */

  request = catt('vejnavn=',urlencode(trim(put(propcase(vej),$UTF8X200.))),'&husnr=',husnr);

  if etage ne '' then request=catt(request,'&etage=',etage);

  request = catt(request,'&postnr=',postnr);

datalines;

Krøyer Kielbergs Vej,3,1,8660,Skanderborg

Købmagergade,7,1,1150,København

Prinsensgade,11, ,9000,Aalborg

Havfruegade,12, ,1234,Odense

Bredgade Vest,4, ,7600,Struer

;

run;

/************************************************************************************************************

* Data step med brug af URL "device"

* Husk at rette ProxyServer variablens værdi så den passer til dit miljø, eller slet PROXY= parametren

* fra infile statementet hvis proxy server ikke bliver anvendt.

************************************************************************************************************/

%let ProxyServer=http://srv01dmk.unx.sas.com:8118;

/************************************************************************************************************

* Svarene fra forespørgslerne udskrives til en tekst fil.

************************************************************************************************************/

filename response "c:\temp\response.csv";

data _null_;

  length url $1000;

  retain headerwritten 0;

  set adresser;

  file response lrecl=5000;

  /************************************************************************************************************

   * url variablen indeholder den fulde URL inklusive søge parametre

   * Fjern evt. udkommenteringen af debug i infile statementet hvis du har problemer med at få det til at virke

************************************************************************************************************/

  url = catt("http://dawa.aws.dk:80/adresser?",request,'&format=csv');

  infile dawa url filevar=url /*proxy="&ProxyServer" */ end=eof encoding='utf-8' /* debug */;

  lineno = 0;

  /************************************************************************************************************

   * Her læses max. 200 liniers "svar" på en forespørgsel.

   * Hvis man forespørger på en upræcis adresse kan der blive returneret tusindvis af adresser som matcher

   * forespørgslen. Hvis der ikke findes en match returneres kun headeren.

   ************************************************************************************************************/

  do until(eof or lineno > 200);

    input;

    lineno + 1;

    /* Skip udskrivning af header linien, kun alleførste linie skal indeholder headeren */

    /* Alle svar indeholder samme header                                                */

    if headerwritten = 0 then do;

      put 'LookupID,' _infile_ ;

      headerwritten = 1;

    end;

    else if lineno > 1 then put LookupID +(-1) "," _infile_;

  end;

  if lineno = 1 then put LookupID ',*Ugyldig/ukomplet adresse*';

run;

/************************************************************************************************************

* Indlæs svarene fra tekst filen til tabellen WORK.RESPONSE.

* Headeren med variabel navne har variable der indeholder tegnet ø derfor sættes validvarname til any.

************************************************************************************************************/

options validvarname=any;

proc import datafile=response out=work.response dbms=csv replace;

run;