楼主: mosuchen
2013 3

[问答] 如何识别一列里的每一行是否含有另一列的任意一行的字符并返回该字符 [推广有奖]

  • 1关注
  • 8粉丝

讲师

92%

还不是VIP/贵宾

-

TA的文库  其他...

mosuchen

威望
0
论坛币
1853 个
通用积分
13.0100
学术水平
11 点
热心指数
11 点
信用等级
6 点
经验
29400 点
帖子
137
精华
0
在线时间
1136 小时
注册时间
2007-3-9
最后登录
2024-4-25

10论坛币
我自己编了一个小程序,可以实现我的目的。但是当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 秒
无标题.png





关键词:Procedure PrxMatch separate Distinct proc sql

回帖推荐

沙发
l1i2n3i4n5g 在职认证  发表于 2018-1-8 12:01:11 |只看作者 |坛友微信交流群
  1. data test;
  2. input
  3. var1 $
  4. var2 $ ;
  5. cards;
  6. aab a
  7. aac b
  8. def ac
  9. efg ab
  10. bfc aac
  11. ;
  12. run;

  13. proc sort data=test(keep=var2) out=test2;
  14.    by var2;
  15. run;

  16. data test1;
  17.    set test(keep=var1);
  18.    do i=1 to n;
  19.       set test2 nobs=n point=i;
  20.       if find(trim(var1),trim(var2)) then output;
  21.    end;
  22. run;
复制代码

使用道具

藤椅
mosuchen 在职认证  发表于 2018-1-8 12:04:45 |只看作者 |坛友微信交流群
为便于大家指教,我附上完整程序。
data test;
input var1$ var2$ ;
cards;
aab a
aac b
def ac
efg ab
bfc aac
;
run;
data test1;
set test;
keep var1;
run;
data test2;
set test;
keep var2;
run;

%Macro recog(objecet,list,var1,var2);
proc sql noprint;
     select distinct &var2 into :chkvar separated by '|'
     from &list;
quit;

data &objecet;
    set &objecet;
        retain pattern n;
        if _n_=1 then do;
            pattern=prxparse("/(&chkvar)/");
                n=count("&chkvar",'|')+1;
        end;
    if prxmatch(pattern,&var1) then
        do i=1 to n;
                        match=scan("&chkvar",i,'|');
                        if index(&var1,strip(match)) then output;
                end;
        else
                do;
                    delete; /*match="无匹配信息";*/
                    output;
                end;
        drop pattern n i;
run;
%mend recog;
%recog(test1,test2,var1,var2);

使用道具

板凳
lovexialulu 发表于 2018-1-8 17:26:54 |只看作者 |坛友微信交流群
  1. data a;
  2. input var1$ var2$ ;
  3. cards;
  4. aab a
  5. aac b
  6. def ac
  7. efg ab
  8. bfc aac
  9. ;
  10. run;

  11. proc sql noprint;
  12.     select count(distinct var2) into :n     from a;
  13.      select distinct var2 into :v1 - :v%sysfunc(strip(&n)) from a;
  14. quit;

  15. data b1(keep=var1 want1) b2(keep= var: want2);
  16. set a;
  17. length ch1-ch%sysfunc(strip(&n)) $50. want1 want2 $2000.;
  18. %macro jj;
  19. %do i=1 %to &n;
  20.    if prxmatch("/&&v&i./",var1) then do;ch&i="&&v&i";end;
  21. if prxmatch("/&&v&i./",var1) then do;want1="&&v&i";output b1;end;
  22. %end;
  23. want2=catx('#',of ch1 - ch%sysfunc(strip(&n)));output b2;
  24. %mend jj;
  25. %jj;
  26. run;
复制代码

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 10:58