SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1582|回复: 5
打印 上一主题 下一主题

求教:如何获得一个字符串在另一个字符串中出现的次数

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-10-16 16:00:39 | 只看该作者

求教:如何获得一个字符串在另一个字符串中出现的次数

比如'*'在'1*23**4*5'中出现了4次。
有什么函数直接有此功能吗?用什么函数最好?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-10-16 16:52:46 | 只看该作者
忙里偷闲,hehe!

data tem;
src='1**c*deab*cc*cd';
rc=length(trim(src))-length(compress(trim(src),'*'));
;run;
proc print;run;

我好像没有看过此类直接的函数,以上的先试试看吧。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-10-16 17:00:42 | 只看该作者
这个方法显然比我的substr的方法强多了,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2003-10-20 11:57:47 | 只看该作者
[quote="willon":4c82a]忙里偷闲,hehe!

data tem;
src='1**c*deab*cc*cd';
rc=length(trim(src))-length(compress(trim(src),'*'));
;run;
proc print;run;

我好像没有看过此类直接的函数,以上的先试试看吧。[/quote:4c82a]

这个方法只能针对单字符,对[b:4c82a][u:4c82a]包含2个或2个以上的字符串[/u:4c82a][/b:4c82a],如[b:4c82a]cc[/b:4c82a],则不能获得正确的rc。

改良方法有2个:
1/ 若SASV9+,则用函数count()
2/ 用do循环
data tem(drop =src i);
        src='1**c*deab*cc*cd';

        i=index(src, 'cc');
            do while (i>0);
              rc + 1;
              src=substr(src, i+1);
              i=index(src, 'cc' );
            end;
run;

另外有个疑问,你所指的[b:4c82a][u:4c82a]字符串记数的概念[/u:4c82a][/b:4c82a]。
src ='1**c*deab*cc*cd';
按您的要求,count(cc)=1还是4?

我的两个方法指的是count(cc)=1。若要求=4则前面的朋友方法也是不错的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2003-10-20 12:37:18 | 只看该作者
try this

data tem;
src='1**c*deab*cc**cd';
repl='**';
rc=(length(src)-length(compress(tranwrd(src,repl,''),'')))/length(repl);
put rc=;
;run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2003-10-20 13:54:10 | 只看该作者
tranwrd + length是个非常简洁高效的方法。谢谢!

为了得到和willon相同的结果,我的程序需要修改一下。
data tem(drop =src i);
        src='1**c*deab*ccc*cd'; /*3c*/
        rep ='cc';
        i=index(src, rep);
            do while (i>0);
              rc + 1;
        *src=substr(src, i+ 1);
              [color=red:49e2b]src=substr(src, i+ length(rep));[/color:49e2b]
              i=index(src, rep );
            end;
run;

如:src='1**c*deab*ccc*cd';   rep ='cc'
修改前rc=2   修改前rc=1

根据实际计数需要,修改不同。

在SASv9+还有个函数COUNTC()值得推荐。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-5 18:18 , Processed in 1.250832 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表