|
楼主

楼主 |
发表于 2011-7-13 22:15:24
|
只看该作者
hash 遍历器的使用
data a;
input id num;
cards;
2 22
5 55
8 88
;
data c;
infile cards dsd;
input id num dif;
cards;
1,,110
2,22,,
3,,330
4,,440
4,,444
5,55,,
6,,660
7,,770
8,88,880
8,88,880
;
对表a进行了hash表定义,key=id,data=num,并给hash表定义了一个遍历器,刚开始指向hash表的第一条观测数据,即为:22(num)!
利用该定义的hash表对数据集c进行匹配,如果键不匹配,则就等价于把遍历器指向的hash表中当前数据在pdv中用来填充c中缺失的num数据的作用一样,当匹配时,直接输出,并把hash表中遍历器向下移动一位,直到新生成的数据test如下:
1 22 110
2 22
3 55 330
4 55 440
4 55 444
5 55
6 88 660
7 88 770
8 88 880
8 88 880
编写的代码如下:
[code:3looar5k]data test(drop=rc temp);
if _n_=0 then set a;
if _n_=1 then do;
declare hash h(dataset:"a",ordered:"a");
h.definekey('id');
h.definedata('num');
h.definedone();
end;
h.output(dataset:'d');
declare hiter iter("h");
rc=iter.first();
set c(rename=(num=temp));
if rc=0 then do;
if h.find()^=0 then output;
else do;
num=temp;output;
rc=iter.next();
end;
end;
run;[/code:3looar5k]
但是最终的结果是跟遍历器始终指向在hash表的第一条观测,并没有向下移动的效果似乎一样!貌似只有hash表中的第一条观测起了覆盖作用一样!望大侠们多多指教,如何才能根据实际情况,恰当的使用遍历器,小弟在此先谢过了! 代码的最终运行结果为(红色的为出错的部分):
1 22 110
2 22
3 [color=#FF0000:3looar5k]22[/color:3looar5k] 330
4[color=#FF0000:3looar5k] 22 [/color:3looar5k]440
4[color=#FF0000:3looar5k] 22 [/color:3looar5k]444
5 55
6 [color=#FF0000:3looar5k]22[/color:3looar5k] 660
7 [color=#FF0000:3looar5k]22[/color:3looar5k] 770
8 88 880
8 88 880 |
|