本人写了四段针对特定逻辑库下批量重命名数据集的程序,希望好朋友们能够做出批评,即哪段程序是最有效率的,并能够再提出新的做法,大家交流下!本人认为,在解决其他同类问题时,这四段程序同样具有
- libname ss 'd:\key sas file';
- proc datasets lib=work kill;
- quit;
- proc datasets lib=ss;
- copy out=work;
- select test:;
- quit;
- /*select*/
- %let lib=work;
- %let prefix=a;
- proc sql;
- create table ss as
- select memname,monotonic() as obs from
- dictionary.tables
- where libname="%upcase(&lib.)";
- quit;
- proc print noobs;
- run;
- proc sql;
- select 'change '||trim(memname)||"=&prefix."||strip(put(obs,5.))||';'
- into :sss separated by ' '
- from ss;
- quit;
- proc datasets lib=&lib. nolist;
- &sss.;
- quit;
- proc delete data=ss;
- run;
- /*call execute*/
- proc datasets lib=work kill;
- quit;
- proc datasets lib=ss;
- copy out=work;
- select test:;
- quit;
- %let lib=work;
- %let prefix=a;
- proc sql;
- create table ss as
- select memname,monotonic() as obs from
- dictionary.tables
- where libname="%upcase(&lib.)";
- quit;
- proc print noobs;
- run;
- data _null_;
- set ss;
- call execute ('proc datasets lib=&lib. nolist;change '||trim(memname)||'=&prefix.'||strip(put(obs,5.))||';');
- run;
- proc delete data=ss;
- run;
- /*宏*/
- proc datasets lib=work kill;
- quit;
- proc datasets lib=ss;
- copy out=work;
- select test:;
- quit;
- %macro ss(lib,prefix);
- proc sql noprint;
- select memname
- into :sss separated by ' '
- from dictionary.tables
- where libname="%upcase(&lib.)";
- quit;
- %let cnt=&sqlobs;
- proc datasets lib=&lib. nolist;
- %do i=1 %to &cnt.;
- %let dsn=%scan(&sss,&i);
- change &dsn=&prefix.&i.;
- %end;
- quit;
- %mend;
- %ss(work,a)
- /*宏2*/
- proc datasets lib=work kill;
- quit;
- proc datasets lib=ss;
- copy out=work;
- select test:;
- quit;
- %let lib=work;
- %let prefix=a;
- proc sql;
- create table sss as
- select memname from dictionary.tables
- where libname="%upcase(&lib.)";
- quit;
- %macro change();
- %let dsid=%sysfunc(open(sss));
- %if &dsid %then %do;
- %let nobs=%sysfunc(attrn(&dsid,nobs));
- %do i=1 %to &nobs.;
- %let rc=%sysfunc(fetchobs(&dsid,&i));
- %let varnume=%sysfunc(varnum(&dsid,memname));
- %let dsn=%sysfunc(getvarc(&dsid,&varnume));
- proc datasets lib=&lib. nolist;
- change &dsn=&prefix.&i.;
- quit;
- %end;
- %let dsid=%sysfunc(close(&dsid));
- %end;
- %else %do;
- %put cannot open the data set---%sysfunc(sysmsg());
- %end;
- %mend change;
- %change
启发性!所以值得讨论!



雷达卡





京公网安备 11010802022788号







