proc sql进一步用于(print varname)SAS

时间:2015-01-05 02:49:39

标签: 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

4 个答案:

答案 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和其他人指出了这一点。