我有一个SAS DS2程序,它从数据步骤打印屏幕输出,如下所示,我想将输出通道传输到文件。 AFAIK,'档案'是DS2中缺少的功能,因为DS2当前正在读取和写入表,有人可以告诉我如何将ds2程序的输出流式传输到文件中吗?谢谢。
put '********* Body (html contents from a stream) **********/';
put _body;
此致 AKS
答案 0 :(得分:2)
DS2没有SAS或SQL或类似目标之外的文件i / o功能。 DS2主要用于实现与Hadoop和Teradata以及其他一些大数据目标的轻松连接;希望它将来会扩展,但它现在还很年轻,而且利用率不高。
也就是说,有一些......创造性的解决方法。一个可能的答案涉及使用日志。这不是伟大的解决方案,但确实有效。
基本上,关闭笔记和源,然后PROC PRINTTO将日志重定向到您想要的文件,PUT到日志,然后重定向并重新打开。警告和错误仍然会记录在日志中,因此不要有任何这些。
对于生产代码来说,这绝对不是 的绝佳解决方案。对于生产代码,我强烈建议写入SQL表或SAS数据集,然后使用旧式数据步骤生成输出。 DS2目前不适用于此类事情。即使语言没有扩展到具有此功能,也可以编写可能的包以便将来更有帮助地执行此操作; JSON包是一个值得一看的好地方,虽然我认为它现在没有这个功能。
这是一个使用日志的例子(一个非常人为的日志):
proc sql;
select name into :namestr
separated by ' '
from sashelp.class
;
select age into :agestr
separated by ' '
from sashelp.class;
quit;
%let namestr = %str(%')&namestr%str(%');
%let agestr = %str(%')&agestr%str(%');
options nonotes nosource;
proc printto log="c:\temp\testds2.txt" new;
proc ds2;
data _null_;
method init();
dcl int rc;
dcl nvarchar(15) name;
dcl int age;
dcl double iter;
dcl nvarchar(1000) namestr;
dcl nvarchar(500) agestr;
name ='';
age = .;
namestr= &namestr.;
agestr = &agestr.;
do iter = 1 to countw(namestr);
name = scan(namestr,iter);
age = scan(agestr,iter);
put name age;
end;
end;
enddata;
run;
quit;
proc printto; run;
options notes source;