跨项目标准化数据集属性

时间:2015-05-29 14:31:47

标签: sas metadata

背景

我有多个需要标准化的旧项目(PRJ01 - PRJ10)。每个都存储在自己的libname下,每个都有大约30个数据集(注意:并非所有研究都有相同的30个数据集)。

变量名称在各个项目中保持一致。但是,多年来,分配给这些变量名称的标签和格式在某些地方发生了变化 - 例如,如下所示:

  

属性不一致研究之间:

data PRJ01.users(label='user identifiers') ;
  attrib USERID label='Username' format=$20. ;
run ;

data PRJ02.users(label='User Identifiers') ;
  attrib USERID label='Name of user' format=$15. ;
run;
     

属性不一致WITHIN研究:

data PRJ02.users(label='User Identifiers') ;
  attrib USERID label='Name of user' format=$15. ;
run; 

data PRJ02.orders(label='Orders') ;
  attrib USERID  label='Name of User' format=$15.) 
         ORDERNO label='Order number' format=8. ;
run ;

我写了一个报告所有不一致的程序。但是,我需要生成所有项目的“整洁”副本,为它们提供所有标准化结构。我目前的想法是,我应该创建一个标准变量的数据集,如下所示我们可以添加和调整,直到我们在那里定义了所有内容:

data standards ;
  attrib USERID  label='Username                                ' format=$20. 
         ORDERNO label='Order Number                            ' format=8.
;run ;

问题:

从这个standards数据集中,将属性应用于存在这些变量的地方的最佳方法是什么?

我会将输出数据集写入新的libnames,例如:PRJ01.users - >如果在变量长度被截断的情况下有任何变量发生变化,则PRJSTD01.users并将错误放入日志中。

1 个答案:

答案 0 :(得分:2)

创建包含标准的字典表:

name     label         format
USERID   Username      $20.
ORDERNO  Order Number  8.

加入包含库中列名的字典表:

proc sql;
create table standards2 as
select
  d.memname,
  s.name,
  s.label,
  s.format
from
  sashelp.vcolumn d
  inner join standards s
  on d.name = s.name
where
  libname eq 'PRJ01'
order by
  d.memname,
  s.name
;
quit;

要得到这个:

memname    name     label         format
users      USERID   Username      $20.
orders     USERID   Username      $20.
orders     ORDERNO  Order Number  8.

然后使用put语句阅读此数据集,以创建执行修改的proc datasets

filename gencode temp;
data _null_;
  set standards2 end=eof;
  by memname;
  file gencode;
  if _n_ = 1 then put       "proc datasets lib=PRJ01 nolist;";
  if first.memname then put "  modify " memname ";";
  put                       "  label " name "='" label "';";
  put                       "  format " name format ";";
  if eof then put           "quit;";
run;
%include gencode / source2;
filename gencode clear;

(从this paper被盗)

您应该能够修改以匹配其余的要求(复制到新库,迭代项目)。