2015-05-29 48 views
2

背景:标准化数据集属性跨项目

我有我需要规范(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; 

属性中的研究不一致:

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,并且如果在变量长度被截断时有任何变量发生变化,则将错误记录到日志中。

回答

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 th在执行您的修改。

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被盗)

你应该能够修改,以您的需求匹配其余(复制到新库,遍历项目)。

+1

这里的一般方法对我来说似乎很合理。我会以不同的方式完成最后一部分 - 如果为每个任务编写宏并生成宏调用而不是执行所有的datastep代码,那么读起来会更容易 - 但这取决于个人偏好。 – Joe

+0

你好,非常感谢。我几乎期待在星期一这样做!有一个愉快的周末:-) – Bendy

+0

嗨,两个 - 它完美谢谢:) – Bendy