数据集中字段数量未知的 sas 动态调用 symput

sas dynamic call symput with unknown number of fields in the dataset

我有以下数据集

data parm2;
    input a b c d e;
    datalines;
1 2 3 4 A
;
run;

问题1:我想要一组宏变量。假设我不知道字段的数量及其对应的字段名称。

问题 2:字段的数据类型不同。

所需的操作如下:

data _null_;
    set parm2;
call symput('a',a);
call symput('b',b);
call symput('c',c);
call symput('d',d);
call symput('e',e);
run;

%put &a;

如果这是你的数据结构,我会转置:

proc transpose data=parm2 out=parmt;
  var _all_;
run;

然后引用这两列创建所有的宏变量及其对应的值:

data _null_;
  set parmt;
  call symput(_name_,col1);
run;

[已编辑 - 一些代码或代码行标有 *,因为 OP 不需要它]

使用 proc sql 字典获取数据中包含的变量名称,并使用 Memnamelibname 规范。

使用data step将获取的变量转化为宏变量。变量的名称存储在名为 name 的列名称下,这就是为什么我们必须将其作为 call symputx( 'variable ' !! left(_n_), **name** );。宏变量Total的作用是告诉你数据集中存在的变量个数。

现在你将有 variable1= a , variable2= b....

%macro definevar ( library, dataset);
proc sql;
create table Attribute as
select * from dictionary.columns;
where memname = upcase( &dataset ) and libname = upcase(&library);
quit;

data letmacro;
set Attribute end=end;
call symputx( 'variable ' !! left(_n_), name );
* if end then call symputx ( Total, _n_);
run;



/*
***** extra ********
data _null_;
set &dataset ;
%do i=1 to &total;
   call symputx ( "var&i" !! left(_n_), &&variable&i );
%end;
run;
***** extra ********
*/

%mend definevar;

%definevar( ifanylibrary, parm2)

我期待着学习@Reeza 的 CALL VNEXT 解决方案

经过一番研究,我找到了以下解决方案。虽然不是很完美,但值得分享。期待@Reeze 的回答

data _null_;
    set parm2;
    array t(*) _numeric_;   /*this deal with different data type*/
    do i = 1 to dim(t);
        call symput(vname(t[i]), t[i]);
    end;
    array t2(*) _character_;
    do i = 1 to dim(t2);
        call symput(vname(t2[i]), t2[i]);
    end;
run;

这是一个使用 VVALUEX 的 Call VNEXT 解决方案,假设您没有与它似乎有效的自动变量同名的变量。从 SAS 派生的解决方案 注:http://support.sas.com/kb/24/798.html

data parm2;
    input a b c d e $;
    datalines;
1 2 3 4 A
;
run;


data _null_;
  set parm2;
  length name ;

 *temporarily set name to not missing to start loop;
  name='blank';
  do while(name ne " ");
    call vnext(name);

    /* Omit automatic variables, and variables created in this step only */
    if trim(name) not in('list','name','flag','i',' ','_ERROR_','_N_') then 
      call symput(name, vvaluex(name));

  end;
run;

%put &a;
%put &b;
%put &c;
%put &d;
%put &e;