我确信这是一件容易的事,但我仍然是SAS的新手,所以我遇到了一些问题:(。
考虑一下,我有一些数据集Table
,列Column $24
(长度很重要)。我想创建一个只有一列HashTable
的数据集Key $11
,其中Key
由Column
的唯一值组成,其长度等于11。
所以,我正在尝试使用哈希对象,但我觉得我做错了:)。
data _null_;
length Key $11;
set Table end = _end;
if _N_ = 1 then do;
declare hash h();
h.defineKey('Key');
h.defineDone();
end;
if length(Column) = 11 then
rc = h.add(Key: Column);
if _end then
rc = h.output(dataset: 'HashTable');
run;
当我提交程序时,我收到错误:
7904 rc = h.add(Key: Column);
ERROR: Incorrect number of data entries specified at line 7904 column 14.
ERROR: DATA STEP Component Object failure. Aborted during the EXECUTION phase.
答案 0 :(得分:2)
Paul Dorfman于2007年在SAS-L上发现了这个问题,Paul Dorfman on Hash error
简单地说,ADD()方法既可以是'key',也可以是'data',也可以是none(这意味着两者)。以下内容也有效,即使您的“数据”尚未明确定义。
data _null_ ;
length key $ 5;
set sashelp.shoes end = _end ;
if _N_ = 1 then do ;
declare hash h() ;
h.defineKey('key') ;
h.defineDone() ;
end ;
if length(Subsidiary)=5 then rc=h.add(key:subsidiary, data:Subsidiary) ;
if _end then h.output(dataset: 'HashTable') ;
run ;
答案 1 :(得分:1)
您的代码对我来说非常好。我注意到的一个错误就是你的陈述:
if length(Column) = 11 then;
rc = h.add(Key: Column);
if _end then;
rc = h.output(dataset: 'HashTable');
有一个额外的分号。 then
之后不应该有分号。如上所述,h.add和h.output是无条件执行的。
以下是使用sashelp.shoes的示例:
data _null_ ;
set sashelp.shoes end = _end ;
if _N_ = 1 then do ;
declare hash h() ;
h.defineKey('Subsidiary') ;
h.defineDone() ;
end ;
if length(Subsidiary)=5 then rc=h.add() ;
if _end then h.output(dataset: 'HashTable') ;
run ;
返回:
115 data _null_ ;
116 set HashTable ;
117 put (_all_)(=) ;
118 run ;
Subsidiary=Tokyo
Subsidiary=Cairo
Subsidiary=Paris
Subsidiary=Seoul
Subsidiary=Dubai
NOTE: There were 5 observations read from the data set WORK.HASHTABLE.
答案 2 :(得分:0)
一个错误是愚蠢的,正如我所料:)
正确的代码(我希望):
data _null_;
length Key $11;
set Table end = _end;
if _N_ = 1 then do;
declare hash h();
h.defineKey('Key');
h.defineDone();
end;
if length(Column) = 11 then do;
Key = Column;
rc = h.add();
end;
if _end then
rc = h.output(dataset: 'HashTable');
run;