是否有任何语句\函数能够获取变量的名称? 最好将它们放入另一个数据集,文本字段或宏变量的列中。
E.g。
- 数据集1
Name age sex
Jk 14 F
FH 34 M
预期数据集
Var_name_of_dataset1
Name
age
sex
PS:我知道一个声明:选择进入,这确实是相关的 它可以将列的值读入具有自定义分隔符的字段中,因此希望有类似的方法将列名读取到字段或列中。
由于
答案 0 :(得分:25)
PROC CONTENTS是在数据集中获取该信息的最快捷方式。列名可以在NAME列中找到。
proc contents data=sashelp.class out=contents noprint;
run;
答案 1 :(得分:20)
您还可以使用datastep和数组函数,例如
data colnames ; set sashelp.class (obs=1) ; array n{*} _NUMERIC_ ; array c{*} _CHARACTER_ ; do i = 1 to dim(n) ; vname = vname(n{i}) ; output ; end ; do i = 1 to dim(c) ; vname = vname(c{i}) ; output ; end ; run ;
答案 2 :(得分:7)
%macro getvars(dsn);
%global vlist;
proc sql;
select name into :vlist separated by ' '
from dictionary.columns
where memname=upcase("&dsn");
quit;
%mend;
这将创建一个名为& vlist的宏变量,该变量将包含数据集中所有变量的名称,并以空格分隔。如果你想在变量名之间使用逗号,那么你所要做的就是将'sepa by'值从''改为','。在where语句中使用upcase函数可以避免在错误的情况下有人传递数据集名称的问题。需要全局语句,因为创建的宏变量不一定在宏之外可用而不将其定义为全局
答案 3 :(得分:3)
从SAS帮助和文档略有改变。
%macro names(dsid);
%let dsid=%sysfunc(open(&dsid, i));
%let num=%sysfunc(attrn(&dsid,nvars));
%let varlist=;
%do i=1 %to &num ;
%let varlist=&varlist %sysfunc(varname(&dsid, &i));
%end;
%let rc = %sysfunc(close(&dsid)); /*edit by Moody_Mudskipper: omitting this line will lock the dataset */
%put varlist=&varlist;
%mend names;
%names(sasuser.class) ;
然后我们保留大小写和关闭数据的顺序,即使数字和字符是混合的。
答案 4 :(得分:0)
我不确定Rawfocus声明读取字典表查询所有库是真的,如果示例使用sashelp.vcolumn而不是那样,那么这种方法非常慢并且访问所有分配的库。 (您可以使用SAS RTRACE系统选项证明这一点。)
我认为对dictionary.columns的SQL查询是这里概述的方法中最快的。显然,macrotised代码可以在没有宏的情况下工作,但宏观点在这里我认为是一个实用工具;将代码放入您最喜欢的宏库中,您再也不需要考虑它了。