rmartins
rmartins

Reputation: 3

How to make API requests with loop in SAS

I'm trying to geocode entities (company) through the Brazilian zip code respectively, using a public API called BrasilAPI.

This is a fictional sample of the data:

data AMOSTRA_ENTIDADE;
infile datalines delimiter=',';
length  CODEMPRESA 3. 
        NOMEEMPRESA $9
        CEP $8;

input   CODEMPRESA 
        NOMEEMPRESA $
        CEP;
datalines;
1,EMPRESA A,71577090
2,EMPRESA B,01026010
10,EMPRESA C,01000000
100,EMPRESA D,92300000
110,EMPRESA E,29010580
;
run;

fictional sample of the data

I recently discovered the http SAS proc for this task, I don't know if there is another one. With that I tried to make the following code snippet to perform the request in the API following these examples I found:

return from the code above: output

My question is, how to make these requests in SAS to return the JSON and other information coming from the request in the API?

What I have input: input

What I'm looking for in the output: expected output

Please, if possible, I would like examples to run on both SAS Enterprise Guide and SAS Viya. Thank you in advance for your help!

Upvotes: 0

Views: 692

Answers (1)

Reeza
Reeza

Reputation: 21294

Good start but you weren't reading in the JSON at all. This should give you a better idea of how to loop this, but it currently does not handle the case of a CEP not being found - I'll leave you to figure out that logic. Otherwise it does work to create a table with CEP + Coordinates you can merge. Rather than the JSON text, I suggest storing the ALLDATA from the JSON and reformat that to the required structured.

data AMOSTRA_ENTIDADE;
infile datalines delimiter=',';
length  CODEMPRESA 3. 
        NOMEEMPRESA $9
        CEP $8;

input   CODEMPRESA 
        NOMEEMPRESA $
        CEP;
datalines;
1,EMPRESA A,71577090
2,EMPRESA B,01026010
10,EMPRESA C,01000000
100,EMPRESA D,92300000
110,EMPRESA E,29010580
;
run;

proc sql;
drop table master_locations;
drop table master_allData;
quit;

%macro get_lat_long(cep);
  %let site="https://brasilapi.com.br/api/cep/v2/&CEP";
  %put NOTE: &site.;
  filename resp temp;

  proc http
     url = &site
     method = "get"
     out = resp;
  run;

  libname resp json;

  
  *keep all data if desired;
  data fullResponse;
      length Value $200.;
      set resp.allData;
      
  run;
  
  *get location coordinates from RESP library;
  data location;
      set resp.location_coordinates;
      CEP=&CEP.;    
  run;
  
  *append to master file;
  proc append base= master_locations data=location;
  run;
  
  proc append base=master_allData data=fullResponse;
  run;

  *remove temporary tables so you do not get wrong data between loops;  
  proc sql;
  drop table location;
  drop table fullresponse;
  quit;
  
  %mend get_lat_long;

  
  data COORDENADAS_ENTIDADE;
   set AMOSTRA_ENTIDADE;
   length macro_call $200;

   macro_call  = cats('%get_lat_long(',CEP,')');
   call execute(macro_call);
run;

Upvotes: 0

Related Questions