背景
我有多个需要标准化的旧项目(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
并将错误放入日志中。
答案 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被盗)
您应该能够修改以匹配其余的要求(复制到新库,迭代项目)。