标题: 如何DATASET 中的小写的变量名字全部变成大写 [打印本页] 作者: shiyiming 时间: 2011-2-15 12:02 标题: 如何DATASET 中的小写的变量名字全部变成大写 一个目录里面有很多的DATASET,每个数据集中既有大写的变量名,还有小写的变量名字。现在我想把这个目录下的数据集中的所有小写的变量名字变成大写,请问该如何处理。作者: shiyiming 时间: 2011-2-16 07:09 标题: Re: 如何DATASET 中的小写的变量名字全部变成大写 [code:sva45j9r]**assume having loaded the directory into library of 'yourLib';
**SAVE your original data sets first;
%let libName_ =yourLib;
proc sql noprint;
create table work._t as select memName, upcase(name) as name_u from dictionary.columns where libname="%upcase(&libName_)";
select count(*) into :totalV from work._t; %put &totalV;
select memName, name_u into :mem1-:mem%left(&totalV), :var1-:var%left(&totalV) from work._t;
quit;
%macro Covert2Ucase(xx);
%let listV =;
%do i =1 %to &totalV;
%if &xx =&&mem&i %then %let listV =&listV &&var&i;
%end;
data &libName_..&xx;
retain &listV; set &libName_..&xx;
%mend Covert2Ucase;
data _null_;
set work._t(keep =MEMname); by memName notsorted;
if first. memName then call execute('%Covert2Ucase('||memName||')'); run;
run;[/code:sva45j9r]
proc sql;
select compbl(name||' as '||upcase(name)) into :inputstr separated by ','
from sashelp.vcolumn
where libname='WORK' and memname='RAW' ;
create table final as
select &inputstr
from raw
;[/code:2qgydhl6]作者: shiyiming 时间: 2011-2-16 17:54 标题: Re: 如何DATASET 中的小写的变量名字全部变成大写 借用huige的方法,对大数据应该快一点
[code:smiawn64]data raw;
do i=1 to 1000000;
id=i;
var1=i*i;
var2=i*8;
output;
end;
;
/*方法2:*/
proc sql noprint;
select compbl(name||' = '||upcase(name)) into :inputstr separated by ' '
from sashelp.vcolumn
where libname='WORK' and memname='RAW' ;
;
quit;
proc datasets lib=work nolist;
modify raw;
rename &inputstr;
quit;
[/code:smiawn64]作者: shiyiming 时间: 2011-2-16 21:45 标题: Re: 如何DATASET 中的小写的变量名字全部变成大写 [code:1hn18clx]%macro Covert2Ucase(xx);
%let k =0;
%do i =1 %to &totalV;
%if (&xx =&&mem&i) and(&&var&i ^=%upcase(&&var&i)) %then%do;
%let k =%eval(&k +1);
%if &k =1 %then%do;
modify &xx; rename
%end;
&&var&i =%upcase(&&var&i) %end;
%end;;
%mend Covert2Ucase;
data _null_;
set work._t(keep =MEMname) end =Eof; by memName notsorted;
if _n_ =1 then call execute('proc datasets library =&libname_ nolist;');
if first. memName then call execute('%Covert2Ucase('||memName||')');
if Eof then call execute('quit;');
run;[/code:1hn18clx]
如果library含有大的数据集。如楼上而言,datasets应该更好。京剧作者: shiyiming 时间: 2011-2-16 22:46 标题: Re: 如何DATASET 中的小写的变量名字全部变成大写 [code:3s5z371q]%let libName_ =yourLib;
proc sql noprint;
create table work._t as select memName, name from dictionary.columns where libname="%upcase(&libName_)";
quit;
%macro Convert1Ucase(dset); modify &dset; %mend Convert1Ucase;
%macro Convert2Ucase(var); rename &var =%upcase(&var); %mend Convert2Ucase;
data _null_;
set work._t end =Eof; by memName notsorted;
if _n_ =1 then call execute('proc datasets library =&libname_ nolist;');
if first. memName then call execute('%Convert1Ucase('||memName||')');
if name ~=upcase(name) then call execute('%Convert2Ucase('||name||')');
if Eof then call execute('quit;');
run;[/code:3s5z371q]
细想此处创造macro 变量列表好像意义很小。故此改正。京剧作者: shiyiming 时间: 2011-2-16 22:53 标题: Re: 如何DATASET 中的小写的变量名字全部变成大写 jingju的程序风格思路很值得学习