我有一个变量,其中包含由|分隔的多个公司符号。我希望能算出那里有多少家公司。即,|的数量+ 1,理想地识别|的位置字符串中的符号。请注意,单个变量中的公司数不会超过五家。我试图使用以下方法,但遇到SAS处理|的事实符号作为特殊操作符。
pattern1 = prxparse('/|/'); /* I can't seem to get SAS to treat this as a text to compare */
start = 1;
stop = length(reassignment2); /* my list of firms is in the variable reassignment2 */
call prxnext(pattern1, start, stop, reassignment2, position, length);
ARRAY Y[5];
do J=1 to 5 while (position > 0);
Y[J]=position;
call prxnext(pattern1, start, stop, reassignment2, position, length);
end;
nfirms=j+1;
run;
答案 0 :(得分:2)
我会有所不同。你真正想要的不是|的数量人物,但实际的公司,对吗?所以搜索那些。你的代码有一些小问题;主要是,在使用prxmatch
之前必须先call prxnext
,你的j + 1是错误的,因为循环迭代器实际上增加了一个超出最后一个合格循环值(我使用j-1,因为我会找到一个元素而且|
是一个正则表达式元字符,如果你真的想要使用它,必须进行转义,除非它在[]
里面,就像我在使用它一样。
data test;
infile datalines truncover;
input @1 reassignment2 $50.;
pattern1 = prxparse('/[^|]+/io'); /* Look for non-| characters */
start = 1;
stop = length(reassignment2); /* my list of firms is in the variable reassignment2 */
rc=prxmatch(pattern1,reassignment2);
if rc>0 then do;
ARRAY Y[5];
do J=1 by 1 until (position = 0);
call prxnext(pattern1, start, stop, reassignment2, position, length);
Y[J]=position;
end;
nfirms=j-1;
end;
else nfirms=0;
put nfirms=;
datalines;
Firm1|Firm2|Firm3
Firm1|Firm2|Firm3|Firm4
Firm1
Firm1|Firm2
;;;;
run;
为了完整起见,您也可以使用call scan
在没有正则表达式的情况下轻松完成此操作。
data test;
infile datalines truncover;
input @1 reassignment2 $50.;
array y[5];
do nfirms=1 by 1 until (position le 0);
call scan(reassignment2,nfirms,position,length,'|');
y[nfirms]=position;
end;
nfirms=nfirms-1; *loop ends one iteration too late;
put nfirms=;
datalines;
Firm1|Firm2|Firm3
Firm1|Firm2|Firm3|Firm4
Firm1
Firm1|Firm2
;;;;
run;
答案 1 :(得分:0)
我同意@Joe的说法,这可以在没有正则表达式的情况下更简单地完成,不过我会进一步简化他的代码以排除使用数组。
data test;
infile datalines truncover length = reclen;
input firmlist $varying256. reclen;
i = 0;
do until(scan(firmlist,i,"|") = "");
i + 1;
end;
nfirms = i - 1;
drop i;
datalines;
Firm1|Firm2|Firm3
Firm1|Firm2|Firm3|Firm4
Firm1
Firm1|Firm2
;
run;
你说你也想捕捉“|”的位置字符串中的字符,但如果每个记录有多个公司,则会有多个“|”字符串中的字符。如果你想要每一个的位置,一个数组可能是一个更好的路线,但如果你只想要一个,index
函数将得到你想要的。您使用delimpos = index(firmlist,"|");
。
我希望有所帮助!