Пейджинг по результатам остальных API? - PullRequest
1 голос
/ 28 марта 2019

Я использую следующий код для извлечения файла json из URL:

options NOQUOTELENMAX;

filename usage "/folders/myfolders/sasuser.v94/usage.json";

%let AccessKey = reallylongstring;

proc http
 url="https://a.url"
 method="GET" out=usage;
 headers 
   "Authorization"="Bearer &AccessKey.";
run;

libname usage json "/folders/myfolders/sasuser.v94/usage.json";

data usage;
 set usage.data;
run;

proc print data=usage noobs;
run;   

однако теперь результаты возвращают более 1000 результатов, и мне нужно как-то проверить свойство nextLink?

в .net Я мог бы использовать что-то вроде этого:

$usagerest = Invoke-Restmethod -url $usageurl -header $authheaders -method get

while ($null -ne $usageRest.nextLink) {
$usageRest = Invoke-Restmethod -uri $usagerest.nextlink -headers $authheaders -method get
}

возможно ли что-то подобное с proc http в sas?

вот древовидное представление фактического json, если это поможет?

enter image description here

До сих пор я пробовал быструю грязную версию:

libname usage1 JSON fileref=resp1;

data x;
set usage1.root;
call symputx('nextLink',nextLink);
run;

proc http
url="%superq(nextLink)"
method="GET" out=resp2;
headers 
   "Authorization"="Bearer &AccessKey.";
run;

libname usage2 JSON fileref=resp2;

data y;
set usage2.root;
call symputx('nextLink',nextLink);
run;

proc http
url="%superq(nextLink)"
method="GET" out=resp3;
headers 
   "Authorization"="Bearer &AccessKey.";
run;

libname usage3 JSON fileref=resp3;

data z;
    set usage3.root;
    call symputx('nextLink',nextLink);
run;

Обзор библиотек:

enter image description here

use1.data образец:

enter image description here

work.x образец:

enter image description here

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

В контексте разрешенной макропеременной, которую необходимо заключить в двойные кавычки, например, значение параметра url=, поместите %superq в двойные кавычки - "%superq(<macro-var-name>)"

Попробуйте

… 
url = "%superq(nextLink)"

Если ссылка продолжает вызывать проблемы, вы можете попробовать

url = "%qsysfunc(urlencode(%superq(nextLink)))"

Вызов макроса один раз для каждой строки в наборе данных управления

Существует множество способов., например

  • Стек 1000 вызовов с помощью data _null_; и call execute(…
  • Proc SQL select nextLink into :link1- для создания 1000 макропеременных
  • Открыть набор данныхс %let ds=%sysfunc(open(… и цикл по 1000 строк - %do %while (%sysfunc(fetch(&ds) = 0))

Пример кода для второго элемента маркера:

Этот пример передает макропеременную из макроса 'looping' вмакрос «рабочий».Когда передается имя макропеременной, макрос var не нужно разрешать и заключать в кавычки для перехода к работнику.Вместо этого работа получает макрос var (он же имя символа) и superq разрешает его в кавычках для использования при генерации исходного кода.По сути, передача макроса var похожа на традиционную концепцию передачи по ссылке.

data have;
  do linknum = 1 to 25;
    link = cats("place=", byte(64+linknum),'&extra="zoom=',linknum,'"&key=MYAPIKEY');
    output;
  end;
run;


%macro processLink(link_mvar=);
  %put url="%sysfunc(urlencode(%superq(&link_mvar)))";
%mend;

%macro processLinks (data=);
  proc sql;
    reset noprint;
    select link into :link1- from &data;
  quit;

  %local i;
  %do i = 1 %to &sqlobs;

    %* pass name of macro variable to macro;
    %processLink (link_mvar=link&i);

  %end;
%mend;

%processLinks(data=have)
1 голос
/ 09 апреля 2019

Вопрос кажется более понятным. Процесс может быть макросизирован для многократного вызова Proc HTTP внутри цикла %do. Каждая страница данных может быть добавлена ​​в набор данных, который будет увеличиваться с каждой полученной страницей.

Непроверенные

%macro getThatPagedJsonData (url=, accesskey=, out=);

  %local page guard;

  %let page = 1;
  %Let guard = 50;  * just in case - prevent infinite/excessive looping during development/testing;

  filename response temp;

  %do %until (%length(%superq(url)) eq 0 or &page > &guard);

    * clear libname, releasing any locks on json repsonse file;
    libname page;

    * prior response will be over written;
    proc http url="%superq(url)" method="GET" out=response;
      headers "Authorization"="Bearer &AccessKey.";
    run;

    * magic json engine;
    libname page JSON fileref=response;

    if &page = 1 %then %do;
      * first page starts the output data set;
      data &out;
        set page.data;
      run;
    %end;
    %else %do;
      * append subsequent pages of data;
      proc append base=&out data=page.data;
      run;
    %end;

    * track number of pages processed;
    %let page = %eval (&page + 1);

    * reset url for %until test;
    %let url=;
    * fetch the nextlink as the url for next iteration of %do %until; 
    * might need error handling here when last page has no nextlink;
    data _null_;
      set page.root;
      call symput('url', trim(nextlink));
    run;
  %end;

%mend;

%getThatPagedJsonData (url=...., accesskey=...., out=serviceAggreements);
...