进一步使用 proc sql into (print varname) SAS
Further usage of proc sql into (print varname) SAS
我以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
假设公司中的变量是name、salary,varname宏变量是"name salary"。当最后一段是运行时,实际上是这样的:
array temp{*} name salary;
姓名和薪水设置为缺少值“.”的默认数值变量。
为什么不直接把变量放在 var_names:
data _null_;
set var_names;
put name;
run;
不确定为什么你的方法不起作用,但现在你可以使用 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
,然后我也在引号中初始化了值。
编辑2:
已测试
如果你绝对不能偏离你的方法,下面是代码(比我上面建议的效率低)
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;
如果您解释了为什么要这样做的话,这似乎是一条很长的路要走,如果您解释了为什么要这样做的话,可能会更容易完成:)。
这是一个使用引号存储值然后将它们放入临时数组的解决方案。
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 库和表的各种元数据这一事实。
我不太明白这个问题的前提,因为你正在做的事情比你需要的要复杂得多。
首先,你不需要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 和其他人指出的那样。
我以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
假设公司中的变量是name、salary,varname宏变量是"name salary"。当最后一段是运行时,实际上是这样的:
array temp{*} name salary;
姓名和薪水设置为缺少值“.”的默认数值变量。
为什么不直接把变量放在 var_names:
data _null_;
set var_names;
put name;
run;
不确定为什么你的方法不起作用,但现在你可以使用 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
,然后我也在引号中初始化了值。
编辑2:
已测试 如果你绝对不能偏离你的方法,下面是代码(比我上面建议的效率低)
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;
如果您解释了为什么要这样做的话,这似乎是一条很长的路要走,如果您解释了为什么要这样做的话,可能会更容易完成:)。 这是一个使用引号存储值然后将它们放入临时数组的解决方案。
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 库和表的各种元数据这一事实。
我不太明白这个问题的前提,因为你正在做的事情比你需要的要复杂得多。
首先,你不需要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 和其他人指出的那样。