SAS中文论坛

标题: 求教:如何获得一个字符串在另一个字符串中出现的次数 [打印本页]

作者: shiyiming    时间: 2003-10-16 16:00
标题: 求教:如何获得一个字符串在另一个字符串中出现的次数
比如'*'在'1*23**4*5'中出现了4次。
有什么函数直接有此功能吗?用什么函数最好?
作者: shiyiming    时间: 2003-10-16 16:52
忙里偷闲,hehe!

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

我好像没有看过此类直接的函数,以上的先试试看吧。
作者: shiyiming    时间: 2003-10-16 17:00
这个方法显然比我的substr的方法强多了,谢谢!
作者: shiyiming    时间: 2003-10-20 11:57
[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则前面的朋友方法也是不错的。
作者: shiyiming    时间: 2003-10-20 12:37
try this

data tem;
src='1**c*deab*cc**cd';
repl='**';
rc=(length(src)-length(compress(tranwrd(src,repl,''),'')))/length(repl);
put rc=;
;run;
作者: shiyiming    时间: 2003-10-20 13:54
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()值得推荐。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2