楼主: davil2000
28745 124

[原创博文] SAS魔法师的字典表格   [推广有奖]

院士

99%

还不是VIP/贵宾

-

TA的文库  其他...

☆大数据时代文库☆

威望
4
论坛币
29697 个
通用积分
13.4100
学术水平
1172 点
热心指数
1121 点
信用等级
1143 点
经验
97076 点
帖子
2730
精华
19
在线时间
3003 小时
注册时间
2004-10-31
最后登录
2022-6-10

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币


      通常情况下,SAS程序员会遇到某个SAS数据集中大量变量需要识别、重命名、排序、删除,或者某个SAS逻辑库中大量数据集需要识别、复制、改名、删除的情况。如果这些变量名或者数据集不是按照计数顺序排列的,那么将这些名称编写进入程序将是一项极为繁琐的任务。然而,借助于只读属性的SAS字典,程序员则能够如同魔法师那样高效处理这类编程任务。 本文将展示,如何使用SQL过程来读取SAS字典信息,产生宏代码来执行后续编程任务。
dictionary.socery.png
      SAS字典有某类型表格组成。这些表格是属性只读的数据视图,内容为当前SAS任务全部可得数据的元数据。它们包含了SAS逻辑库、数据集、宏、外部文件、检索的相关信息,可以利用来提高编程工作的效率。SAS v9.3字典包括了三十个表格,可以直接引用这些表格,或者从SASHELP逻辑库中间接引用。下面将讨论如何以SQL过程来获得字典表信息。
      借助于SQL过程的SELECT语句,SAS程序员可以获得元数据------识别30个SAS字典表格并且获取其中的数据单元。字典表格的结构信息可以直接观察到,这些信息也可以生成一个数据集。SQL过程能够返还全部字典表的名称以及各表格的信息,或者仅显示表的名称:
  
        proc sql;
          title "All the tables's information from the Dictionary libref";
          select * from dictionary.dictionaries;
          title "Only the tables's name from the Dictionary libref";
          select unique memname from dictionary.dictionaries;
          quit;   
      特定字典表的内容也能够使用SQL语句查询,并且可以将查询结果使用 CREATE TABLE 语句产生一个数据集。比如,通过以上代码将"dictionaries"替换为"members",可以查询全部逻辑库的对象信息。
         proc sql;
          title "Slect memnames from the specific dictionary table";
          create table dictionarymembers as
                select memname from dictionary.members;
          select * from dictionary.members;
          quit;
此外,SQL过程的DESCRIBE TABLE语句能够用来查看字典表的结构,并将结果输出到LOG窗口。
         proc sql;
          describe table dictionary.members;
          title "All data sets from a specific library";
          select memname
          from    dictionary.members
             where libname=upcase("sasuser") and memtype=upcase("data");
          quit;
以上代码中除了以DESCRIBE TABLE语句显示字典表结构外,SELECT语句还使得SASUSER逻辑库里全部数据集的文件名在OUTPUT窗口列示。那么,如何在编程中利用这些文件名?   
      SAS字典表格的魔力在于能够用来操控SQL过程。借助于该过程的查询语句SELECT......INTO: ......SEPARATED BY...FROM......WHERE......,SAS字典表的信息能被读取并且写入某宏变量之中。例如,这段代码将SASUSER逻辑库里全部数据集的文件名写入了宏变量DSNAME之中:
         proc sql;
          select memname
          into:   dsname separated by ' '
          from    dictionary.members
             where libname = upcase("sasuser") and memtype=upcase("data");
          %put    &dsname;
          quit;
以下部分涉及DICTIONARY.COLUMNS、DICTIONARY.TABLES以及DICTIONARY.MEMBERS等字典表的内容。我们将探索在编程实践中,如何以SAS字典表来提高效率。

DICTIONARY.COLUMNS
   对于当前SAS任务的全部数据集,表格DICTIONARY.COLUMNS包含了诸如变量的名称、类型、长度和标签等信息。表格视图中每一变量的属性都可以使用DESCRIBE语句来识别。
         proc sql;
          describe table dictionary.columns;
          quit;
dictionary.columns.png
【例1.1】将数据集SASHELP.CARS的全部变量名存入宏变量VARNAME中,变量名之间用空格分隔。
    SELECT ... INTO : ... SEPARATED BY ......
         proc sql;
          select name into :varname separated by ' ' from DICTIONARY.COLUMNS
          where libname = "SASHELP" and memname = "CARS";
          %put &varname;
          quit;
【例1.2】将数据集SASHELP.CARS的以"m"为首字符的变量名存入宏变量VARNAME中,变量名之间用空格分隔。然后,利用该宏变量进行数据集相关操作。
         proc sql;
          select name into :varname separated by ' ' from DICTIONARY.COLUMNS
          where libname = "SASHELP" and memname = "CARS"
                   and substr(strip(name),1,2) like "M%" ;
          data data1;
          set SASHELP.CARS(drop=&varname);
          run;
          /*strip函数用来去除字符串前后空格*/
          /*substr(string,1,2)函数表示从字符串位置1开始读取2个字符*/
【例1.3】首先,将数据集SASHELP.CARS中带有FORMAT的变量找出。然后,将这些变量的名称存入宏变量VARNAME,名称和格式的联合字符串存入宏变量VARFMT。
         proc    sql;
          select strip(name), strip(name)||' '||format
          into:   varname separated by ' ',   :   varfmt separated by ' '
          from    DICTIONARY.COLUMNS
                where libname = "SASHELP"
                and memname = "CARS"
                and format ^= ' ';
          quit;
          %put ***VARNAME: &varname ***VARFMT: &varfmt;
          proc   freq data=sashelp.cars;
          tables   &varname./missing;
          format    &varfmt;
          run;

DICTIONARY.TABLES
        字典表格DICTIONARY.TABLES包含了诸如逻辑库名、数据文件的类型、创建日期、观测值数、变量数等信息。当前SAS任务的任一数据集的信息都包含在这个表格中。使用SQL过程的DESCRIBE语句,能够在LOG窗口中查看该字典表格的结构。
  
        proc sql;
          describe table dictionary.tables;
          quit;
dictionary.tables.png
【例2.1】将数据集SASHELP.CARS的观测值数和变量数分别存入两个宏变量中。
  
        proc sql noprint;
          select strip(put(nobs,8.)), strip(put(nvar,8.))
          into    :nobs, :nvar
          from    DICTIONARY.TABLES
                where libname = "SASHELP"
                and memname = "CARS";
          quit;
          %put ***nobs: &nobs ***nvar: &nvar;
【例2.2】将逻辑库SASUSER中在2011年后创建的数据集名称存入宏变量VALDATA中。
  
        proc sql;
          describe table dictionary.tables;
          select MEMNAME
          into :valdata separated by ' '
          from DICTIONARY.TABLES
                where libname = "SASUSER" and memtype="DATA"
                and year(datepart(CRDATE)) gt 2011;
          quit;
          %put &valdata;

DICTIONARY.MEMBERS
    字典表格DICTIONARY.MEMBERS包含了逻辑库名称、数据文件类型(数据集、视图或者目录)、路径等信息。使用SQL过程的DESCRIBE语句,能够在LOG窗口中查看该表格的结构。
         proc sql;
          describe table dictionary.members;
          quit;
dictionary.members.png
【例3.1】将逻辑库SASUSER中数据集的名称和路径列示出来。
         proc sql;
          select strip(memname)||' '||strip(path)
          from    dictionary.members
          where libname = upcase("sasuser") and memtype=upcase("data");
          quit;
【例3.2】将某物理路径下全部SAS数据文件转换为,包含数据集观测值部分的.csv文件以及数据集描述部分的.txt文件。
  
        %let    dir=D:\Documents\test;
          /**---------the codes below needn't be changed--------*;*/
          options   nofmterr nonotes;
          libname mydb "&dir";
          x      "cd &dir";
          %let library = mydb;
          proc sql;
          create table t_dta as
          select memname, memtype
             from dictionary.members
                where libname=upcase("&library") and   memtype="DATA";
          quit;
          data   _null_;   set t_dta end=last;
          if last then call symput('nobs',trim(_n_));
          run;
          %macro transfer(nobs);
             %let number=1;
             %do %while(&number le &nobs);
          proc printto new log='log.log' print='output.log';   run;
          data   _null_;   set t_dta;
          if _n_=&number then call symput('dsname',trim(memname));
          run;
          ods select Contents.DataSet.Variables;
          ods output Contents.DataSet.Variables=&dsname._desc(drop=Member Num);
          proc contents data=&LIBRARY..&dsname;   run;
          ods output Close;
          proc sort;   by pos;   run;
          data &dsname._vars;   format num 5.;
          set ;   num=_n_;   drop pos;
          run;
          proc export data=&LIBRARY..&dsname
          outfile="&dsname..csv" dbms=csv replace;   run;
          proc export data=&dsname._vars   outfile="&dsname._vars.txt"
          dbms=csv replace;   run;
          proc datasets lib=work nolist;
          delete &dsname:;
          run;
          quit;
                %let number=%eval(&number+1);
             %end;
          %mend transfer;
          %transfer(&nobs);
          proc printto;
          run;

      在SAS环境中,字典表格的运用使得程序员成为编程能力超强的魔法师。借助于SAS宏语句和SQL过程语句,人们能够从字典表格中能够获得极富价值的元数据信息。本文仅对SAS字典表格作了简单介绍,从字典表格里还能够发掘更多的财富信息。希望SAS程序员和爱好者能够深入研究SAS字典表格,从而促进编程效率的显著提高。   

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:魔法师 information Dictionary Informatio Variables 表格 魔法师

已有 25 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
wind19 + 1 精彩帖子
Silon.Jon + 1 + 1 + 1 看了标题,觉得也许和我最近纠结的问题有关.
wqhx620 + 1 + 1 + 1 观点有启发
拥抱大海的鱼 + 1 + 1 + 1 你也太有才啦
夏之鹭江 + 1 + 1 + 1 精彩帖子
a6566792 + 1 + 1 + 1 精彩帖子
sharpyaoyun + 1 + 1 + 1 精彩帖子
angelinacong + 1 + 1 + 1 对论坛有贡献
iczhi + 20 精彩帖子
denver + 5 精彩帖子

总评分: 经验 + 480  论坛币 + 180  学术水平 + 43  热心指数 + 42  信用等级 + 41   查看全部评分

本帖被以下文库推荐

R是万能的,SAS是不可战胜的!
沙发
dxystata 发表于 2012-11-29 19:00:11 |只看作者 |坛友微信交流群
谢谢分享!

使用道具

藤椅
大数据之魂 发表于 2012-11-29 19:40:37 |只看作者 |坛友微信交流群
SAS字典表格很少被使用来编程  潜能强大等待人们去开发

使用道具

板凳
有福有德 在职认证  发表于 2012-11-29 19:57:48 |只看作者 |坛友微信交流群
这种批处理技术确实很厉害,不过最厉害的还是楼主呀
所有模型都是错的

使用道具

报纸
myxixi 发表于 2012-11-29 20:45:30 |只看作者 |坛友微信交流群
很不错

SAS很强大,期待更多的牛人挖掘它的潜能

使用道具

地板
ziyenano 发表于 2012-11-29 21:12:16 |只看作者 |坛友微信交流群
dictionary中的数据集在sashelp库中,也有对应的视图

使用道具

7
maayy_zhou 发表于 2012-11-29 21:18:18 |只看作者 |坛友微信交流群
非常感谢分享!

使用道具

8
南海游客 发表于 2012-11-29 22:26:48 |只看作者 |坛友微信交流群
字典表确实很强  努力学习中

使用道具

9
CRouGD 发表于 2012-11-29 23:52:45 |只看作者 |坛友微信交流群
感谢楼主

使用道具

10
tangliang0905 发表于 2012-11-30 02:56:39 来自手机 |只看作者 |坛友微信交流群
果断收藏,真乃精品贴

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-5 03:28