如何在sas Scl中动态创建Scl变量

如何在sas Scl中动态创建Scl变量,sas,sas-af,Sas,Sas Af,我正在寻找一个解决方案,解决几个程序员都在努力解决的问题,但我在互联网上找不到任何解决方案。这是: 从包含名称/值对的SAS表开始。例如: varName varValue Name Bart Age 54 Job writer Start 1983 Scl程序应读取表的内容,并为每个varName/varValue对生成一个Scl变量 做这样的小事应该很容易,但我就是找不到正

我正在寻找一个解决方案,解决几个程序员都在努力解决的问题,但我在互联网上找不到任何解决方案。这是:

从包含名称/值对的SAS表开始。例如:

varName          varValue 
Name             Bart
Age              54
Job              writer
Start            1983
Scl程序应读取表的内容,并为每个varName/varValue对生成一个Scl变量

做这样的小事应该很容易,但我就是找不到正确的方法。它快把我逼疯了。有人有解决办法吗


Bart

这里是一个将数据集中的两个变量放入scl列表的示例,当使用scl而不是未知数量的单个变量时,scl列表是一个非常好的数据容器。表中有多少行无关紧要,然后可以使用列表函数按名称访问数据。 将此代码保存到目录条目sasuser.mymethods.Copytwovar2list.scl INIT:有一个测试示例,您可以使用该用法创建一个单独的scl条目

COPY_TWO_VAR_VALUES_TO_LIST:
   *-----------------------------------------------------------------*
   | Method Name: COPY_TWO_VAR_VALUES_TO_LIST
   *--------------------------Entry Parameters-----------------------*
   | d_id      8   I   Input dataset id
   | l_id      8   O   output list
   | var1     $32  I   Var1 - Name of list item
   | var2     $32  I   Var2 - Value of item
   *-----------------------------------------------------------------*;
   method dsname     $45
          l_id        8
          var1       $32
          var2       $32
           ;
   d_id=open(dsname,'i');

   varnum1=varnum(d_id,var1);
   vartyp1=vartype(d_id,varnum1);

   if var1 ne var2 then do;
       varnum2=varnum(d_id,var2);
       vartyp2=vartype(d_id,varnum2);
   end;

   * --- fill the list with data set values;
   do while(fetch(d_id) ne -1 );
      i+1;
      if vartyp1='C' then
         u_vname=getvarc(d_id,varnum1);
      else
         u_vname=left(putn(getvarn(d_id,varnum1),'BEST12.'));

      if var1 ne var2 then do;
          if vartyp2='C' then
             u_vvalue=getvarc(d_id,varnum2);
          else
             u_vvalue=left(putn(getvarn(d_id,varnum2),'BEST12.'));

      end;
      else
         u_vvalue = u_vname;
      rc=setitemc(l_id,u_vvalue,i,'Y');
      u_vname=nameitem(l_id,i,u_vname);
   end;
   rc=close(d_id);
endmethod;

INIT:
* --- test example of usage ;
l_list=makelist();

call method('sasuser.mymethods.copytwovar2list.scl', 
    'COPY_TWO_VAR_VALUES_TO_LIST',
    'sashelp.class',l_list,
    'NAME',
    'AGE');

call putlist(l_list,'l_list=',2);

return;

下面是将数据集中的两个变量放入scl列表的示例,当使用scl而不是未知数量的单个变量时,scl列表是一个非常好的数据容器。表中有多少行无关紧要,然后可以使用列表函数按名称访问数据。 将此代码保存到目录条目sasuser.mymethods.Copytwovar2list.scl INIT:有一个测试示例,您可以使用该用法创建一个单独的scl条目

COPY_TWO_VAR_VALUES_TO_LIST:
   *-----------------------------------------------------------------*
   | Method Name: COPY_TWO_VAR_VALUES_TO_LIST
   *--------------------------Entry Parameters-----------------------*
   | d_id      8   I   Input dataset id
   | l_id      8   O   output list
   | var1     $32  I   Var1 - Name of list item
   | var2     $32  I   Var2 - Value of item
   *-----------------------------------------------------------------*;
   method dsname     $45
          l_id        8
          var1       $32
          var2       $32
           ;
   d_id=open(dsname,'i');

   varnum1=varnum(d_id,var1);
   vartyp1=vartype(d_id,varnum1);

   if var1 ne var2 then do;
       varnum2=varnum(d_id,var2);
       vartyp2=vartype(d_id,varnum2);
   end;

   * --- fill the list with data set values;
   do while(fetch(d_id) ne -1 );
      i+1;
      if vartyp1='C' then
         u_vname=getvarc(d_id,varnum1);
      else
         u_vname=left(putn(getvarn(d_id,varnum1),'BEST12.'));

      if var1 ne var2 then do;
          if vartyp2='C' then
             u_vvalue=getvarc(d_id,varnum2);
          else
             u_vvalue=left(putn(getvarn(d_id,varnum2),'BEST12.'));

      end;
      else
         u_vvalue = u_vname;
      rc=setitemc(l_id,u_vvalue,i,'Y');
      u_vname=nameitem(l_id,i,u_vname);
   end;
   rc=close(d_id);
endmethod;

INIT:
* --- test example of usage ;
l_list=makelist();

call method('sasuser.mymethods.copytwovar2list.scl', 
    'COPY_TWO_VAR_VALUES_TO_LIST',
    'sashelp.class',l_list,
    'NAME',
    'AGE');

call putlist(l_list,'l_list=',2);

return;