SAS中文论坛

标题: hash 遍历器的使用 [打印本页]

作者: shiyiming    时间: 2011-7-13 22:15
标题: 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
作者: shiyiming    时间: 2011-7-13 22:58
标题: Re: hash 遍历器的使用
后来仔细想了下,确实是遍历器始终只在hash表的第一条观测,更正后的代码如下:
[code:1m6iy9ck]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');
retain rc;
declare hiter iter("h");
if _n_=1 then rc=iter.first();
do until(last);
set c(rename=(num=temp)) end=last;
if h.find()^=0 then output;
else do;
num=temp;output;
rc=iter.next();
end;
end;
run;[/code:1m6iy9ck]




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2