楼主: mosuchen
2029 5

[问答] 请教:识别是否包含特定字符,如果是,则返回特定字符。 [推广有奖]

  • 1关注
  • 8粉丝

已卖:580份资源

副教授

0%

还不是VIP/贵宾

-

TA的文库  其他...

mosuchen

威望
0
论坛币
2170 个
通用积分
154.7792
学术水平
11 点
热心指数
11 点
信用等级
6 点
经验
19897 点
帖子
136
精华
0
在线时间
1188 小时
注册时间
2007-3-9
最后登录
2025-12-9

楼主
mosuchen 在职认证  发表于 2017-5-21 11:04:39 |AI写论文
20论坛币

请教如何进行下列操作:识别是否包含特定字符,如果是,则返回特定字符。

为求清晰说明,我举例如下。

data test;

input var1 $ var2 $;

cards;

aab a

aac b

def c

efg a

bfc c

;

proc print;

run;

得到:

           Obs   var1    var2

            1    aab      a

             2    aac      b

             3    def      c

             4    efg      a

             5    bfc      c

我是用的程序如下:

proc sql;

     select distinctvar2 into :chkvar separated by ''

     from test;

quit;

data test;

        settest;

        ifprxmatch("/[&chkvar]/",var1)>0 then match=1;

       elsematch=0;

run;

得到:

  Obs   var1    var2    match

  1    aab      a        1

  2     aac     b        1

  3    def      c        0

  4    efg      a        0

  5     bfc     c        1

但这不是我要的结果,我想要的结果应当如下

  Obs   var1    var2    match

  1    aab      a        a

  1    aab      a        b

  2     aac     b        a

2     aac     b        c

  3    def      c        无匹配信息

  4    efg      a        无匹配信息

  5     bfc     c        b

  5     bfc     c        v

于是我使用了下面的程序,但是这个程序无法运行。请教大神如何操作才可以实现我想要的结果。

data test;

        settest;

        ifprxmatch("/[&chkvar]/",var1)>0 then match="/[&chkvar]/";

       elsematch="无匹配信息";


run;

关键词:PrxMatch Distinct proc sql separate Select 如何

回帖推荐

沙发
l1i2n3i4n5g 在职认证  发表于 2017-5-21 11:04:40
  1. data test;
  2. input var1 $ var2 $;
  3. cards;
  4. aab a
  5. aac b
  6. def c
  7. efg a
  8. bfc c
  9. ;

  10. proc sql noprint;
  11.      select distinct var2 into :chkvar separated by ''
  12.      from test;
  13. quit;

  14. data test;
  15.         set test;
  16.         var1_=var1;
  17.         pattern=prxparse("/([&chkvar])/");
  18.         if prxmatch(pattern,var1_) then
  19.                 do until (prxmatch(pattern,var1_)=0);
  20.                         match=prxposn(pattern,1,var1_);
  21.                         var1_=compress(var1_,match);
  22.                         output;
  23.                 end;
  24.         else do;
  25.                 match="无匹配信息";
  26.                 output;
  27.         end;
  28. run;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
zwnSAS121 + 5 + 1 + 1 + 1 精彩帖子
mosuchen + 5 + 2 + 2 + 2 精彩帖子

总评分: 论坛币 + 10  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

藤椅
mosuchen 在职认证  发表于 2017-5-22 11:21:36
我想了一个下午,编了一个宏实现的,效率奇低。非常感谢l1i2n3i4n5g 的程序,佩服。

板凳
mosuchen 在职认证  发表于 2017-5-22 11:22:51
追加奉上5个论坛币。

报纸
mosuchen 在职认证  发表于 2017-5-22 14:00:06
追加一个操作问题。
我换了几个数据,test表格变成下面这种。var2的取值长短不一。
data test;
input var1$ var2 $;
cards;
aab a
aac b
def ac
efg ab
bfc aac
;
run;

再按您给的程序跑,得到的结果如下。
  

var1

  
  

var2

  
  

var1_

  
  

pattern

  
  

match

  
  

aab

  
  

a

  
  

b

  
  

1

  
  

a

  
  

aab

  
  

a

  
  

1

  
  

b

  
  

aac

  
  

b

  
  

c

  
  

1

  
  

a

  
  

aac

  
  

b

  
  

1

  
  

c

  
  

bfc

  
  

aac

  
  

fc

  
  

1

  
  

b

  
  

bfc

  
  

aac

  
  

f

  
  

1

  
  

c

  
这个表格只是匹配了a,b,c,单个字母,对于ac,ab,aac等字母组合并未匹配。请问能否将ac,ab,aac等字母组合也进行匹配?我的实际数据包含这些组合。


地板
l1i2n3i4n5g 在职认证  发表于 2017-5-23 17:37:38
mosuchen 发表于 2017-5-22 14:00
追加一个操作问题。
我换了几个数据,test表格变成下面这种。var2的取值长短不一。
data test;
  1. data test;
  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 distinct var2 into :chkvar separated by '|'
  13.      from test;
  14. quit;

  15. data test;
  16.     set test;
  17.         retain pattern n;
  18.         if _n_=1 then do;
  19.             pattern=prxparse("/(&chkvar)/");
  20.                 n=count("&chkvar",'|')+1;
  21.         end;
  22.     if prxmatch(pattern,var1) then
  23.         do i=1 to n;
  24.                         match=scan("&chkvar",i,'|');
  25.                         if index(var1,strip(match)) then output;
  26.                 end;
  27.         else
  28.                 do;
  29.                     match="无匹配信息";
  30.                     output;
  31.                 end;
  32.         drop pattern n i;
  33. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
mosuchen + 5 + 2 + 2 + 2 热心帮助其他会员

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 03:20