SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1626|回复: 8
打印 上一主题 下一主题

如何DATASET 中的小写的变量名字全部变成大写

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-2-15 12:02:53 | 只看该作者

如何DATASET 中的小写的变量名字全部变成大写

一个目录里面有很多的DATASET,每个数据集中既有大写的变量名,还有小写的变量名字。现在我想把这个目录下的数据集中的所有小写的变量名字变成大写,请问该如何处理。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-2-16 07:09:34 | 只看该作者

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]

***JingJu
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-2-16 14:03:27 | 只看该作者

Re: 如何DATASET 中的小写的变量名字全部变成大写

[code:2qgydhl6]data raw;
    input id $ var1 $ var2 $;
datalines;
a1 11 12
a2 21 22
;

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-2-16 17:54:23 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-2-16 21:45:19 | 只看该作者

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应该更好。京剧
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-2-16 22:46:06 | 只看该作者

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 变量列表好像意义很小。故此改正。京剧
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-2-16 22:53:33 | 只看该作者

Re: 如何DATASET 中的小写的变量名字全部变成大写

jingju的程序风格思路很值得学习

我最近把一小块需要经常改动的地方放到txt里面直接用include调用
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-2-23 12:18:31 | 只看该作者

Re: 如何DATASET 中的小写的变量名字全部变成大写

各位大神的杰作,已拜读!非常的感谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-2-23 14:20:19 | 只看该作者

Re: 如何DATASET 中的小写的变量名字全部变成大写

哦。。。-,- 原来上面几位都是版主。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-12 18:42 , Processed in 0.071307 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表