SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1109|回复: 1
打印 上一主题 下一主题

hash 遍历器的使用

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-7-13 22:58:54 | 只看该作者

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]
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 05:30 , Processed in 0.072219 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表