2月 20, 2011

Posted by in 数据处理 | 5 条评论

利用SAS系统数据视图进行批量操作

一些实际问题中,我们需要对某些数据集、某些变量等进行批量的操作和处理。对其中的某些问题,利用逻辑库sashelp下的一些系统数据视图(sashelp.vcolumn、sashelp.vmember、sashelp.vindex、sashelp.vtable等)可以较为方便的处理。

本文利用SAS系统数据视图进行批量操作进行简单的说明。

1.利用sashelp.vcolumn数据视图

ashelp.vcolumn中包含了所有的逻辑库名、数据集名、变量名等等,如下图:

这里,网友问,对某些数据集data1…datan进行set连接,需要处理不同数据集中相同变量的字符长度不同的问题。

对于该问题,可以利用读取sashelp.vcolumn数据视图,将要set的数据集“DATA%”找出来,连接libname和memname并建立为宏变量data_set表示set语句中的数据集;读取sashelp.vcolumn数据集,取出每个变量的最大长度作为新数据集中变量的长度,进而解决。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
%macro m_set;
proc sql noprint;
    create table hs.vcolumn as select libname,memname,name,length
        from sashelp.vcolumn
        where memname like 'DATA%'
        order by memname,name,length;
    create table hs.temp as select name,max(length)	as max_length
        from  hs.vcolumn
        group by name;
    select distinct catx('.',libname,memname) into: data_set separated by ' '
        from hs.vcolumn;
    select name,max_length,count(name) into : set_var1 - : set_var99 ,: set_length1 - : set_length99, : var_num
        from hs.temp;
quit;
data hs.newdata;
	%do i=1 %to &var_num;
	length &&set_var&i $ &&set_length&i;
	%end;
	set &data_set;
	run;
%mend;

另外,这里,网友希望把指定逻辑库下的所有数据集中的所有小写的变量名字变成大写,ahuige和tianwild给出的解决代码中都用到了sashelp.vcolumn数据视图。

其他sashelp.vmember、sashelp.vindex、sashelp.vtable等,和sashelp.vcolumn类似,在不同问题中都可以起到很好的作用。

2.利用sashelp.vmacro数据视图

SAS macro symbol table(2)中提到过它的应用,sashelp.vmacro数据视图存储着所有宏变量的相关信息,在编写调试宏时可以随时对之进行查看,以检验代码的正确性。

下面的代码利用sashelp.vmacro数据视图,对所有的用户定义的全局宏变量进行批量删除:

1
2
3
4
5
6
7
8
9
10
11
12
%macro delvars;
  data vars;
    set sashelp.vmacro;
  run;
  data _null_;
    set vars;
    temp=lag(name);
    if scope='GLOBAL' and substr(name,1,3) ne 'SYS' then
      call execute('%symdel '||trim(left(name))||';');
  run;
%mend;
%delvars

 

参考文献

  1. SAS 9.2 Language Reference Concepts (2 Edition)
  2. http://support.sas.com/kb/26/154.html
  1. 写点有意思的东西啊 别一天天就输入输出输入输出输入输出 输入输出不是爹
    这样吧 给你布置一个命题作文
    辅助抢沙发脚本 大致要求是 监视一些个wp博客的更新情况 一旦更新 就把更新的标题用信息的方式推送到指定手机上来提醒抢沙发 发信息这块可以用已有的第三方飞信API实现

    [回复]

    hssnow 回复:

    哈哈,R神牛出现!
    俺小菜还在积累当中,写地无趣暂时先忍忍吧。对于博客抢沙发这种高端活、还要写脚本,俺也确实不会啊。
    不过,先记在这里,有生之年一定会尽力去完成神牛布置的这个作文。
    :-)

    [回复]

    Xiao Nan 回复:

    神毛 有这时间耍嘴皮子都写出来了 给你一周时间研究 下周这时候哥要看到成果

    [回复]

    hssnow 回复:

    wait for it

    [回复]

  2. 哈哈,这些都是很基础的东西,掌握好之后,用SAS会感觉随心所欲的。

    [回复]

发表评论

返回顶部