SAS DS2 将语句输出到文件
SAS DS2 put statement output to a file
我有一个 SAS DS2 程序,它从如下数据步骤在屏幕上打印输出,我想将输出传送到一个文件。 AFAIK,'file' 是 DS2 中缺少的功能,因为 DS2 当前读取和写入表,有人可以让我知道如何将 ds2 程序的输出流式传输到文件吗?谢谢。
put '********* Body (html contents from a stream) **********/';
put _body;
此致,
AKS
DS2 没有超出 SAS 或 SQL 或类似目标的文件 i/o 功能。 DS2 的存在主要是为了能够轻松连接到 Hadoop 和 Teradata 以及其他一些大数据目标;希望它会在未来得到扩展,但它现在还很年轻,没有得到很好的利用。
也就是说,有一些...创造性的解决方法。一种可能的答案是使用日志。这不是一个很好的解决方案,但它确实有效。
基本上,关闭笔记和来源,然后 PROC PRINTTO 将日志重定向到您想要的文件,PUT 到日志,然后重定向回来并重新打开。警告和错误仍会记录在日志中,因此不要有任何警告和错误。
这绝对不是生产代码的绝佳解决方案。对于生产代码,我强烈建议写入 SQL table 或 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;
我有一个 SAS DS2 程序,它从如下数据步骤在屏幕上打印输出,我想将输出传送到一个文件。 AFAIK,'file' 是 DS2 中缺少的功能,因为 DS2 当前读取和写入表,有人可以让我知道如何将 ds2 程序的输出流式传输到文件吗?谢谢。
put '********* Body (html contents from a stream) **********/';
put _body;
此致, AKS
DS2 没有超出 SAS 或 SQL 或类似目标的文件 i/o 功能。 DS2 的存在主要是为了能够轻松连接到 Hadoop 和 Teradata 以及其他一些大数据目标;希望它会在未来得到扩展,但它现在还很年轻,没有得到很好的利用。
也就是说,有一些...创造性的解决方法。一种可能的答案是使用日志。这不是一个很好的解决方案,但它确实有效。
基本上,关闭笔记和来源,然后 PROC PRINTTO 将日志重定向到您想要的文件,PUT 到日志,然后重定向回来并重新打开。警告和错误仍会记录在日志中,因此不要有任何警告和错误。
这绝对不是生产代码的绝佳解决方案。对于生产代码,我强烈建议写入 SQL table 或 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;