进一步使用 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 和其他人指出的那样。