获取SAS表中宏变量的值

获取SAS表中宏变量的值,sas,sas-macro,enterprise-guide,sas-stored-process,Sas,Sas Macro,Enterprise Guide,Sas Stored Process,我在SAS中有一组输入宏变量。它们是动态的,并根据sas存储进程中的用户选择生成 For example:There are 10 input values 1 to 10. The name of the macro variable is VAR_. If a user selects 2,5,7 then 4 macro variables are created. &VAR_0=3; &VAR_=2; &VAR_1=5; &VAR_2=7; 第一个后缀

我在SAS中有一组输入宏变量。它们是动态的,并根据sas存储进程中的用户选择生成

For example:There are 10 input values 1 to 10.
The name of the macro variable is VAR_. If a user selects 2,5,7 then 4 macro variables are created. 
&VAR_0=3;
&VAR_=2;
&VAR_1=5;
&VAR_2=7;
第一个后缀为0的值提供计数。下一个3提供了值

注意:如果用户仅选择一个值,则仅创建一个宏变量。例如,如果用户选择9,则&var_uu9;将创建。不会有任何count宏变量。 我正在尝试使用这些变量创建sas表

应该是这样的

OBS    VAR
-----------
1      2
2      5
3      7
-----------
这就是我试过的。不确定这是否是正确的方法。 它没有给我一个最终的解决方案,但我至少可以得到表中宏变量的名称。我怎样才能得到他们的价值观

data tbl1;
do I=1 to &var_0;
VAR=CAT('&VAR_',I-1);
OUTPUT;
END;
RUN;
PROC SQL;
CREATE TABLE TBL2 AS 
SELECT I,
CASE WHEN VAR= '&VAR_0' THEN '&VAR_' ELSE VAR END AS VAR
from TBL1;
QUIT;
谢谢你的帮助


Jay

SAS已经帮您将它们存储在一个表中,您只需解析出您想要的。该表称为SASHELP.VMACRO或DICTIONARY.MACROS

下面是一个例子:

%let var=1;
%let var2=3;
%let var4=5;

proc sql;
create table want as
select * from sashelp.vmacro
where name like 'VAR%';
quit;

proc print data=want;
run;

我不了解您的编号方案,如果可以的话,建议您更改;
&var\uu
变量非常混乱

无论如何,最简单的方法是。它从宏符号表中返回一个值,您可以在运行时指定该值

%let VAR_0=3;
%let VAR_=2;
%let VAR_1=5;
%let VAR_2=7;

data want;  
  do obs = 1 to &var_0.;
    var = input(symget(cats('VAR_',ifc(obs=1,'',put(obs-1,2.)))),2.);
    output;
  end;
run;

我认为真正的问题是存储进程的不一致行为。当存在多个选择时,它仅创建
0
1
变量。我认为你的例子有点不恰当。如果
VAR_0
的值为3,则其应为
VAR_3
宏变量。此外,
VAR_
VAR_1
的值也应设置为相同的值

为了解决这个问题,我以前做过类似的事情。首先,让我们为参数名指定一个宏变量,以便代码可用于其他程序

%let name=VAR_;
然后首先确保存在最小的宏变量

%global &name &name.0 &name.1 ;
然后将
0
变量设置为空时,确保有一个计数

%let &name.0 = %scan(&&&name.0 1,1);
然后确保您有一个
1
变量。因为它应该与宏变量具有相同的值,没有后缀,所以只需重新分配它

%let &name.1 = &&&name ;
现在您的数据步骤更简单了

data want ;
  length var $32 value $200 ;
  do i=1 to &&&name.0 ;
    var=cats(symget('name'),i);
    value=symget(var);
    output;
  end;
run;

变量模式类似于SAS的web界面如何返回用户选择。我还看到它只返回一个变量,而根本不创建
\u0
变量。@Tom-Hmm,那太奇怪了。为什么“第一个”是
&var\u
而不是
&var\u 1
?不确定,我假设逻辑是这样的。如果将字段定义为“月”,并且它不是“多选”,则获取名为“月”的变量。因此,他们还希望返回变量名MONTH,当它是multi-select时。我已经好几年没看它了,但我认为它使这个月和个月都有了变化。但也许是我的代码添加了MONTH1,因为它看起来很奇怪。谢谢你,乔。很好。谢谢你的帮助。汤姆是对的。命名约定有点不同。第一个变量将同时位于VAR_和VAR_1之下。如果只选择一个值,则只有一个变量,即VAR_。如果是这种情况(如果VAR_1=VAR),则不需要i-1位或IFC位。谢谢Reeza。很好。谢谢你的帮助。