Proc 数据集单步修改多个数据集
Proc datasets modify several datasets in single step
我正在使用以下方法从数据集中删除标签:
proc datasets lib=my_lib memtype=data nolist ;
modify my_data_1 ;
attrib _all_ label=' ';
run;
quit;
我想对几个数据集执行此操作,my_data_1,...,my_data_n。使用以下 returns 一个错误(期望 ; , /):
proc datasets lib=my_lib memtype=data nolist ;
modify my_data_1 my_data_2 my_data_3 ; * and so on ... *;
attrib _all_ label=' ';
run;
quit;
我想知道是否有办法对以下情况应用例外:
proc datasets lib=my_lib memtype=data nolist ;
modify _all_ ;
attrib _all_ label=' ';
run;
quit;
我要修改的数据集占多数,这样效率会更高
构建数据集 为数据集及其上的变量分配标签;
options mprint;
%macro createThem;
%do i = 1 %to 3;
data my_data_&i. (label="Set &i.");
label j="Set &i.";
do j = 1 to &i;
output;
end;
run;
%end;
%mend;
%createThem;
证明成功;
proc sql;
select memname, memlabel from sashelp.vtable
where libname='WORK' and memname like 'MY_DATA%';
select memname, name, label from sashelp.vcolumn
where libname='WORK' and memname like 'MY_DATA%';
run;
编写一个宏来从一个数据集中删除标签;
%macro eraseLabel(data);
proc datasets lib=WORK memtype=data nolist ;
modify &data. (label=' '); ** Remove label form dataset **;
attrib _all_ label=' '; ** Remove label form variable(s) **;
run;
quit;
%mend;
将此宏应用于涉及的数据集;
data _null_;
set sashelp.vtable;
where libname='WORK' and memname like 'MY_DATA%';
call execute('%eraseLabel('||memname||')');
run;
证明成功;
proc sql;
select memname, memlabel from sashelp.vtable
where libname='WORK' and memname like 'MY_DATA%';
select memname, name, label from sashelp.vcolumn
where libname='WORK' and memname like 'MY_DATA%';
run;
更简单的方法是使用复制和select,如:
proc datasets ;
copy in=sashelp out=work;
select cars baseball;
attrib _all_ label=' ';
run;
这里的另一种方法是构建对 proc datasets
的单个调用,它将一次性完成所有操作,在过程中使用多个 run;
组。目标是构建这样的东西:
data example1 example2;
set sashelp.class;
label sex = 'example label';
run;
proc datasets lib = work nolist;
modify example1;
attrib _all_ label = '';
run;
modify example2;
attrib _all_ label = '';
run;
quit;
这可以通过相当简单的宏循环或调用执行的数据步骤来实现,例如
data _null_;
set sashelp.vtable end = eof;
where libname = 'WORK' and memtype = 'DATA' and memname eq: 'EXAMPLE';
if _n_ = 1 then call execute('proc datasets lib = work nolist nodetails;');
call execute(catx(' ','modify',memname,'; attrib _all_ label = ""; run;'));
if eof then call execute('quit;');
run;
我正在使用以下方法从数据集中删除标签:
proc datasets lib=my_lib memtype=data nolist ;
modify my_data_1 ;
attrib _all_ label=' ';
run;
quit;
我想对几个数据集执行此操作,my_data_1,...,my_data_n。使用以下 returns 一个错误(期望 ; , /):
proc datasets lib=my_lib memtype=data nolist ;
modify my_data_1 my_data_2 my_data_3 ; * and so on ... *;
attrib _all_ label=' ';
run;
quit;
我想知道是否有办法对以下情况应用例外:
proc datasets lib=my_lib memtype=data nolist ;
modify _all_ ;
attrib _all_ label=' ';
run;
quit;
我要修改的数据集占多数,这样效率会更高
构建数据集 为数据集及其上的变量分配标签;
options mprint;
%macro createThem;
%do i = 1 %to 3;
data my_data_&i. (label="Set &i.");
label j="Set &i.";
do j = 1 to &i;
output;
end;
run;
%end;
%mend;
%createThem;
证明成功;
proc sql;
select memname, memlabel from sashelp.vtable
where libname='WORK' and memname like 'MY_DATA%';
select memname, name, label from sashelp.vcolumn
where libname='WORK' and memname like 'MY_DATA%';
run;
编写一个宏来从一个数据集中删除标签;
%macro eraseLabel(data);
proc datasets lib=WORK memtype=data nolist ;
modify &data. (label=' '); ** Remove label form dataset **;
attrib _all_ label=' '; ** Remove label form variable(s) **;
run;
quit;
%mend;
将此宏应用于涉及的数据集;
data _null_;
set sashelp.vtable;
where libname='WORK' and memname like 'MY_DATA%';
call execute('%eraseLabel('||memname||')');
run;
证明成功;
proc sql;
select memname, memlabel from sashelp.vtable
where libname='WORK' and memname like 'MY_DATA%';
select memname, name, label from sashelp.vcolumn
where libname='WORK' and memname like 'MY_DATA%';
run;
更简单的方法是使用复制和select,如:
proc datasets ;
copy in=sashelp out=work;
select cars baseball;
attrib _all_ label=' ';
run;
这里的另一种方法是构建对 proc datasets
的单个调用,它将一次性完成所有操作,在过程中使用多个 run;
组。目标是构建这样的东西:
data example1 example2;
set sashelp.class;
label sex = 'example label';
run;
proc datasets lib = work nolist;
modify example1;
attrib _all_ label = '';
run;
modify example2;
attrib _all_ label = '';
run;
quit;
这可以通过相当简单的宏循环或调用执行的数据步骤来实现,例如
data _null_;
set sashelp.vtable end = eof;
where libname = 'WORK' and memtype = 'DATA' and memname eq: 'EXAMPLE';
if _n_ = 1 then call execute('proc datasets lib = work nolist nodetails;');
call execute(catx(' ','modify',memname,'; attrib _all_ label = ""; run;'));
if eof then call execute('quit;');
run;