如何读取SAS数据集中的变量名称?

时间:2011-03-21 08:05:10

标签: variables sas

是否有任何语句\函数能够获取变量的名称? 最好将它们放入另一个数据集,文本字段或宏变量的列中。

E.g。

- 数据集1

Name age sex

    Jk   14   F
    FH   34   M
  • 预期数据集

    Var_name_of_dataset1

    Name
    age
    sex
    

PS:我知道一个声明:选择进入,这确实是相关的 它可以将列的值读入具有自定义分隔符的字段中,因此希望有类似的方法将列名读取到字段或列中。

由于

5 个答案:

答案 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代码可以在没有宏的情况下工作,但宏观点在这里我认为是一个实用工具;将代码放入您最喜欢的宏库中,您再也不需要考虑它了。