2017-01-23 119 views
2

我有一个SAS数据集值传递SAS数据集列作为宏参数

yyyymm 
201605 
201606 
201607 
201608 
201609 

我试图找到一种方法同时通过这些值一个宏,使得

do while dataset still has value 
%macro passdata(yyyymm); 
end 

我如何在SAS中做到这一点。有人可以帮助一个示例/代码片段。

+0

你在上面做什么听起来更像是你不需要一个宏,只需要一个正常的数据步骤。 '数据要;设置your_dataset;运行;'看起来就是这样。你能解释一下为什么这不适合你的需求?什么是'%passdata'在做什么? – Joe

+1

看看CALL EXECUTE。该文档可能正好是你正在寻找的样本,否则,这里是一个完整的代码示例https://gist.github.com/statgeek/beb97b1c6d4517dde3b2 – Reeza

回答

-1

试试这个例子,尝试修改,以满足您的需求......从“源”数据集,我们可以使用呼叫symput()将宏令牌分配给每个观测(由SAS自动数据集变量ň如此分化My_token1,My_token2等)一旦你定义了一组宏变量,只需循环它们即可!该程序将打印从源中的所有个人记录到SAS日志:

data source; 
do var=1000 to 1010; 
output; 
end; 
run; 

data _null_; 
set source; 
call symput(compress("My_token"||_n_),var); 
run; 

%put &my_token1 &my_token4; 

%Macro neat; 

%do this=1 %to 11; 

*Check the log.; 
%put &&My_token&this; 

%end; 

%mend; 
%neat; 
+0

没有解释的代码不是一个好的答案。请解释发生了什么,以及为什么这是一个很好的解决方案,而不仅仅是提供代码。 – Joe

+0

我根据您的建议添加了一些上下文。谢谢。 – procpy

3

正如先前评论中提及,一个方式来传递参数是通过调用执行程序。请注意,这必须在datastep环境中完成。这些行是从您输入的集合中读取的。

您可以输入多个变量。只需在'||'中添加更多变量分隔符。请注意,变量中可能有很多空格。 (==谨慎对照)

这是一个小的示例代码。测试。

data start_data; 
    input date_var ; 
    datalines; 
     201605 
     201606 
     201607 
     201608 
     201609 
     ; 
run; 

%macro Do_stuff(input_var); 
    %put 'Line generates value ' &input_var; 
%mend do_stuff; 

data _null_; 
    set start_data; 
    call execute('%do_stuff('||date_var||')' ); 
run;