在宏内部的sas哈希

时间:2016-09-01 08:15:29

标签: hash macros sas

我想创建一个使用哈希的函数。正在散列的表有3列:年龄,性别,a。我想通过以下方式使用宏:

  1. 在数据步骤之前定义宏:

    %macro hashfind(age, sex) ;
    rc=tab.find(key: &age, key: &sex );
    %LET p=a ;
    %PUT p;
    %mend;
    
  2. 打开数据步骤, 将哈希定义如下:

    if _n_=1 then
            do;
                declare hash tab();
                rc=tab.definekey('Age');
                rc=tab.definekey('Sex');
                rc=tab.definedata('a');
                rc=tab.definedone();
    
                do until (eof1);
                    set work.tab end=eof1;
                    rc=tab.add();
                    put rc;
                end;
    end;
    
  3. 按以下方式在数据步骤中使用宏:

  4. abc=%hashfind(30, 'M') ;
    
  5. 这样" abc"值始终等于1.表格不正确。但是,在我执行宏并将此值分配给宏abc = a之外,这是正确的值。

    总结一下:如何在宏内部使用整个哈希? (我将来会扩展宏,所以它是必要的。)

    或者:有没有人知道如何定义一个以我喜欢的方式使用哈希的函数?使用PROC FCMP不是一种选择,因为PROC FCMP定义的功能中的散列在我使用的SAS 7.1中不可用。

2 个答案:

答案 0 :(得分:1)

如果您将您的广告称为%hashfind(30,'M')而不是abc=%hashfind(30,'M');,那么它应该有用。

当您以第二种方式调用它时,您的SAS DATA步骤代码变为abc=rc=tab.find(key: 30, key: 'M');这是有效代码,并将1指定为abc的值,因为rc可能从add()得到值1并且find()返回1(假设找到了密钥)。

如果要指定数据步骤变量的名称来保存返回代码,在这种简单的情况下,您可以将宏定义更改为:

%macro hashfind(age, sex) ;
tab.find(key: &age, key: &sex )
%mend;

我最后删除了rc =和分号。这使它更像功能。 然后,您可以调用abc=%hashfind(30,'M');

我跳过讨论你的宏%let和%put语句,因为我不确定你要用它们做什么。

答案 1 :(得分:0)

我创建了这个宏,使代码更加用户友好。它的编写方式只将已找到的变量放在日志中,但修改它应该相当容易。

宏有4个参数:键,要查找的变量,输入数据集以及要查找的值。

%macro hashfind(byvars, findvars, inset, find);

%let data_key = %trim(&byvars);
%let data_key = %sysfunc(tranwrd(&data_key,%str( ), %str(",")));
%let findvars = %trim(&findvars);

data _NULL_;
if 0 then set &inset;

if _N_ = 1 then do;
   declare hash tab(dataset: "&inset.");

   rc = tab.DefineKey  ("&data_key.");
   rc = tab.DefineData ("&findvars.");
   rc = tab.DefineDone ();
end;

&byvars = "&find.";
rc = tab.find();
put &findvars=;

run;

%mend;

然后可以按如下方式调用宏:

%hashfind(key1 key2 key3 etc, var, dataset, value);

这可能会给你一个良好的开端,希望它有所帮助。

相关问题