Sas 通过RESTAPI结果分页?
我使用以下代码从url中提取json文件:Sas 通过RESTAPI结果分页?,sas,Sas,我使用以下代码从url中提取json文件: 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
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
}
sas中的proc http是否可以实现类似的功能
这里有一个实际json的树状图,如果有帮助的话
到目前为止,我已经尝试了一个快速脏版:
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;
图书馆概览:
用法1.数据示例:
work.x示例:
感谢您提供需要双引号引用的已解析宏变量的上下文,例如url=选项值,请将%superq放在双引号-%superq中 试一试 如果链接仍然很麻烦,您可以尝试
url = "%qsysfunc(urlencode(%superq(nextLink)))"
在控件数据集中每行调用一次宏
有很多方法,例如
通过数据null_200;堆叠1000次调用;并调用执行…
Proc SQL select nextLink into:link1-创建1000个宏变量
使用%let ds=%sysfuncopen…打开数据集,并在%sysfuncfetch&ds=0时循环1000行-%do%
第二个项目符号项的示例代码:
此示例将宏变量从“循环”宏传递到“工作者”宏。当传递宏变量名时,不必解析宏变量,也不必引用宏变量以将其传递到工作进程中。取而代之的是,该工作将获得宏var aka symbol name,并使用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)
这个问题似乎更清楚。可以对进程进行宏化,以便在%do循环内重复调用Proc HTTP。每一页数据都可以附加到一个数据集,该数据集将随着检索到的每一页而增长 未经测试
%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);
这是可能的,只是在SAS中更详细。模式是相同的-在usage.data数据集中查找nextLink数据项,并在PROC HTTP上保持循环,直到nextLink为空。您将需要使用SAS宏代码编写此代码-这是您熟悉的吗?因此,对于下一个http get,使用该字符串读取usage.root,循环直到没有nextlink?是的,.NET Powershell就是这样做的?您引用的代码正在执行。在SAS中会更加冗长,因为不支持直接访问nextLink,您必须找出usage.data数据集的结构并找到nextLink。虽然SAS可以读取JSON数据,但从分层JSON数据到一堆平面SAS表的映射相当混乱。@ChrisLong尝试了上面的快速脏表,但在新url中使用了&……您需要使用许多引用函数中的一个来解决此问题-可能使用“url=%quote&nextlink”就足够了,但是不要引用我的话,看到我在那里做了什么吗?谢谢Richard%superqnextLink工作,我已经更新了上面的脏版本,什么是通过unitl循环的最佳方式没有下一个链接Richard,很抱歉我是一个noob,我将把初始过程http放在哪里,存储数据,然后解析下一批1000条记录的下一个链接?我只是想也许我把这个问题弄糊涂了,第一个http proc检索了我需要的1000行数据,如果链接到下一组数据时有更多数据可用,还会有一个条目。不是第一次得到1000个链接吗?再次感谢汉克斯·理查德,经过一点调整,我让这个概念起作用了,很棒的工作
%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);