我自己编了一个小程序,可以实现我的目的。但是当VAR2数据太多时,下面的程序据不能用了。因为宏变量有字符限制。我想请教一下,如果var2数据很多,比如有十万个观测,这时如何实现下面程序同样的效果?
我用自己的数据时,因为数据量太大出现报错。报错的图见下面。
1 /*我自己编了一个小程序,可以实现我的目的。但是当VAR2数据太多时,下面的程序据不能用了。因为宏变量有字符限制。我想请教一下,如果var2数据很多,比如有十万个观测,这时如何实现下面程序同样的效果?*/
2
3 data test;
4 input var1$ var2$ ;
5 cards;
NOTE: 数据集 WORK.TEST 有 5 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.04 秒
CPU 时间 0.06 秒
11 ;
12 run;
13 data test1;
14 set test;
15 keep var1;
16 run;
NOTE: 从数据集 WORK.TEST. 读取了 5 个观测
NOTE: 数据集 WORK.TEST1 有 5 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.04 秒
CPU 时间 0.03 秒
17 data test2;
18 set test;
19 keep var2;
20 run;
NOTE: 从数据集 WORK.TEST. 读取了 5 个观测
NOTE: 数据集 WORK.TEST2 有 5 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.04 秒
CPU 时间 0.04 秒
21
22 %Macro recog(objecet,list,var1,var2);
23 proc sql noprint;
24 select distinct &var2 into :chkvar separated by '|'
25 from &list;
26 quit;
27
28 data &objecet;
29 set &objecet;
30 retain pattern n;
31 if _n_=1 then do;
32 pattern=prxparse("/(&chkvar)/");
33 n=count("&chkvar",'|')+1;
34 end;
35 if prxmatch(pattern,&var1) then
36 do i=1 to n;
37 match=scan("&chkvar",i,'|');
38 if index(&var1,strip(match)) then output;
39 end;
40 else
41 do;
42 delete; /*match="无匹配信息";*/
43 output;
44 end;
45 drop pattern n i;
46 run;
47 %mend recog;
48 %recog(test1,test2,var1,var2);
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.03 秒
NOTE: 从数据集 WORK.TEST1. 读取了 5 个观测
NOTE: 数据集 WORK.TEST1 有 7 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.02 秒
CPU 时间 0.03 秒