CSDN博客

img AnyJack

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

发表于2004/9/20 13:41:00  1630人阅读

分类: SAS

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的

0 0

相关博文

我的热门文章

img
取 消
img