使用动态名称重命名列

时间:2014-05-20 19:50:02

标签: sas

我有一个.xls文件的列名(使用excelcs引擎进行导入),它是动态的,每天都在变化。

我想知道如何在sas中进行引用和重命名动态列名,而不知道它将被称为什么?

2 个答案:

答案 0 :(得分:3)

这取决于动态变化的方式。如果它完全不可预测 - 您无法编写代码来消除它,或者消除其他已知列 - 您最简单的选择可能是使用GETNAMES=NO,然后自己设置名称。

如果它在某种程度上是可预测的(例如它是" MYDYNAMIC_XXXX"其中XXXX以某种方式改变),你可以从dictionary.columns中找出它。 (根据需要修改libname / memname / etc.; memname是数据集名称。)

proc sql;
 select name into :dynname
  from dictionary.columns
  where libname='WORK' and memname='MYDATASET'
    and name like 'MYDYNAMIC_%';
quit;

或者,如果您需要知道,可以使用NOT(IN(...))子句来消除已知的列名。

最后,如果它位于一个一致的位置,则比使用GETNAMES=NO更容易根据变量号(where varnum=5查询dictionary.columns,例如,如果它是第五个变量号)。

答案 1 :(得分:2)

扩展Joe的最后评论 - 该列是否处于相同位置,只是称为不同的东西?

如果是这样,您可以使用dictionary.columns表,选择特定的列号,并将相应的列名存储在宏变量中。

例如,您的列是Excel / dataset中的第5列...

/* Pull column name */
proc sql ;
  select name into :DYNVAR
  from dictionary.columns
  where libname = 'SASHELP'
    and memname = 'CLASS'
    and varnum  = 5 ;
quit ;

/* Then to reference the column simply substitute it for &DYNVAR */
data want ;
  set sashelp.class (keep=&DYNVAR) ;
run ;

如果需要,您可以将其扩展到多个列......

/* Pull column name */
proc sql ;
  select name into :DYNVARS separated by ' '
  from dictionary.columns
  where libname = 'SASHELP'
    and memname = 'CLASS'
    and varnum  in (1,4,5) ;
quit ;

/* Then to reference the columns simply substitute it for &DYNVARS */
data want ;
  set sashelp.class (keep=&DYNVARS) ;
run ;