使用哈希对象从表创建字典

时间:2015-10-27 21:16:11

标签: hash sas

我确信这是一件容易的事,但我仍然是SAS的新手,所以我遇到了一些问题:(。

考虑一下,我有一些数据集Table,列Column $24(长度很重要)。我想创建一个只有一列HashTable的数据集Key $11,其中KeyColumn的唯一值组成,其长度等于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.

3 个答案:

答案 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;