SAS9新体验-在DATA STEP中使用对象

类别:编程语言 点击:0 评论:0 推荐:

SAS9新体验-关于DATA STEP的使用

不说那么多了,呵,真高兴,今天装上SAS 9.1.2了
小试了一个小小的技巧,还挺管用的
不知你有没有碰到这样的麻烦,比如在遍历数据集时需要打开一个字典表进行匹配搜索,你可能会这样做
?%let n=1000;
?data _null_;
?set 要遍历的数据集;
?arrary arr1{&n};
?if _n_=1 then do;
??装载字典表数据到数组arr1
?end;
?....
?匹配当前记录到字典表
?run;
?555,真郁闷,那数组开多大才好呢,其实也可以这样解决,把字典表的记录条数存在一个宏变量中去,就算这样,也够麻烦的,还有匹配要自己写呢,要是写的不好,说不定速度就下降了,闷死了
?呵呵,不过现在可好了,SAS终于提供了一种终极解决方案,就是提供了2个可以在DATA STEP中使用的对象,分别为
?Hash object
、Hash Iterator Object
?不用说了吧,用过C++的人就知道了,那个HASH对象用来存储数据,Iterator对象就用来遍历hash对象中的数据了,OK,就是这样简单
?好了,来个例子吧,引用别人的,不是我的,不过测试是通过的
/* Richard A. DeVenezia
?* www.devenezia.com
?* Feb 11, 2003
?*
?* Show the values of the data items of a DATA Step hash object in the log
?*/

%macro putHash (hash, vars);

? %*
? %* hash - variable that references a hash object
? %* vars - space separated list of variables linked to the data items of hash
? %*??????? separate with pound sign (#) to get varname=varvalue format
? %*;

? %* generate a random variable name;
? %local random hi rc;
? %let random = %substr(%sysfunc(ranuni(0),10.8),3);
? %let hi = hi_&random;
? %let rc = rc_&random;

? %* emit DATA Step code that iterates the hash and
? %* puts the data items values in the log;

? declare hiter &hi ("&hash");
? do &rc = &hi..first() by 0 while (&rc = 0);
??? put %sysfunc(translate(&vars,=,#));
??? &rc = &hi..next();
? end;
? &hi..delete();
? put;

? %put WARNING: Values of variables &vars will change;

%mend;

data _null_;
? * prep the PDV, this lazy way is not always recommended;
? if 0 then set sashelp.class(obs=0);

? declare hash H (dataset:'sashelp.class');
? H.defineKey ('Name');
? H.defineData('Name', 'Age', 'Weight', 'Sex');
? H.defineDone();

? %putHash (H,name#age#weight#sex#);
? %putHash (H,name age weight sex);

? stop;
run;
?看到输出结果了吧,还有什么不明白么?实在不知道就去看SAS帮助吧,很EASY的

本文地址:http://com.8s8s.com/it/it27338.htm