我使用sashelp库数据集作为示例
proc datasets library=sashelp;
contents
data=company
out=work.var_names;
quit;
run;
现在我使用proc sql来存储变量名
proc sql noprint;
select name into: varname separated by ' '
from var_names;
quit;
%put &varname;
现在我想在日志上打印变量名称
data newdata (drop=i);
array temp{*} &varname;
do i=1 to dim(temp);
put temp{i};
end;
run;
打印时。而不是变量名。
由于
日志:
337 %put &varname;
DEPTHEAD JOB1 LEVEL1 LEVEL2 LEVEL3 LEVEL4 LEVEL5 N
虽然我想要
DEPTHEAD
JOB1
LEVEL1
LEVEL2
LEVEL3
LEVEL4
LEVEL5
N
答案 0 :(得分:3)
假设公司中的变量是name,salary,varname宏变量是“name salary”。当最后一个段运行时,它实际上是这样的:
array temp{*} name salary;
名称和工资设置为缺省值'。'的默认数值变量。
为什么不将变量放在var_names中:
data _null_;
set var_names;
put name;
run;
答案 1 :(得分:2)
不确定为什么你的方法不起作用,但是现在你可以使用scan
函数来提取元素,代码几乎是自我解释的,如果你没有得到它,请告诉我
data _null_;
array temp{*} &varname;
do i=1 to dim(temp);
temp_1 = scan("&varname.",i);
put temp_1;
end;
second_element=scan("&varname.",2);
put second_element=;
run;
修改强> 你的方法
array temp{*} &varname
最终转换为
array temp{*} DEPTHEAD JOB1 LEVEL1 LEVEL2 LEVEL3 LEVEL4 LEVEL5 N;
无效,因为这样做定义了数组变量名,而不是初始化值
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000201956.htm
寻找此声明
array simple{3} red green yellow;
如果你想按自己的方式去做,那么你必须做这样的事情
data _null_;
array tempar{8} $ tempar1-tempar8 ("DEPTHEAD" "JOB1" "LEVEL1" "LEVEL2" "LEVEL3" "LEVEL4" "LEVEL5" "N");
do i=1 to dim(tempar);
put tempar(i)=;
end;
run;
首先请注意我已经定义了数组的各个元素 - tempar1-tempar8
,并使用char
定义了它$
,然后我用引号初始化了这些值。
<强> EDIT2:强>
<强>测试强> 如果你绝对不能偏离你的方法,下面是代码(效率低于我上面的建议)
proc datasets library=sashelp;
contents
data=company
out=work.var_names;
quit;
run;
proc sql noprint;
select quote(compress(name)) into: varname separated by ' '
from var_names;
select count(name) into: Numofelements from var_names;
quit;
%put %quote(&varname.);
%put &Numofelements;
data _null_;
array tempar{%sysfunc(compress(&Numofelements.))} $ tempar1-tempar%sysfunc(compress(&Numofelements.)) (%quote(&varname.));
do i=1 to dim(tempar);
put tempar(i)=;
end;
run;
答案 2 :(得分:2)
如果您解释了为什么要这样做,这似乎是一件很容易做的事情,如果您解释了为什么要这样做:)。 这是一个使用引号存储值然后将它们放入临时数组的解决方案。
proc sql noprint;
select quote(trim(name)) into: varname separated by ' '
from var_names;
quit;
%put &varname;
data new data;
array var_names{&sqlobs} $ _temporary_ (&varname);
put var_names(2);
do i=1 to dim(var_names);
put var_names(i);
end;
run;
这是使用您的数据集的第二个解决方案,因为我发现尽可能避免使用宏是一种好习惯。
data newdata;
set var_names;
if _n_=2 then put name;
run;
并注意您可以使用
_all_, _numeric_ or _character_
引用变量列表的快捷方式。一个数组只能有一种类型,所以我假设所有变量都是数字或字符。以及SASHELP.VCOLUMN包含有关所有SAS库和表的各种元数据的事实。
答案 3 :(得分:2)
我真的不明白这个问题的前提,因为你做的事情比你需要的更复杂。
首先,你不需要proc内容。
proc sql noprint;
select name into :varname separated by ' '
from dictionary.columns
where libname='SASHELP' and memname='COMPANY';
quit;
其次,这是获取变量名称的一种更简单的方法,即使您不希望它们为%put。
data _null_;
set sashelp.company;
array _names &varname.;
do _i = 1 to dim(_names);
_v = vname(_names[_i]);
put _v=;
end;
run;
我根本看不到_temporary_
数组的价值。 vname
很乐意为您提供数组中变量的名称,如果这是您之后的内容。老实说,这似乎是一个人为的例子,尽管Reese和其他人指出了这一点。