Regex 分析SAS 9.2中包含'|';性格
我有一个变量,它包含由|符号分隔的多个公司。我想数一数那里有多少家公司。i、 例如,|+1的数字,理想情况下标识|符号在字符串中的位置。注:单个变量中的公司数不得超过五家。我试图使用以下方法,但遇到这样一个事实:SAS将|符号视为特殊运算符Regex 分析SAS 9.2中包含'|';性格,regex,sas,Regex,Sas,我有一个变量,它包含由|符号分隔的多个公司。我想数一数那里有多少家公司。i、 例如,|+1的数字,理想情况下标识|符号在字符串中的位置。注:单个变量中的公司数不得超过五家。我试图使用以下方法,但遇到这样一个事实:SAS将|符号视为特殊运算符 pattern1 = prxparse('/|/'); /* I can't seem to get SAS to treat this as a text to compare */ start = 1; stop = length(reassignmen
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;
我会做一些不同的事情。你真正想要的不是|个字符的数量,而是实际的公司,对吗?所以,寻找那些。您的代码有一些小问题;首先,在使用
调用prxnext
之前,必须先prxmatch
,因为循环迭代器的增量实际上超过了最后一个限定循环值(我使用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;
为了完整性起见,您也可以使用callscan
在不使用正则表达式的情况下轻松完成此操作
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;
我同意@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,“|”)代码>
我希望这有帮助 数组用于存储每条记录的位置;OP表示这是一个期望的输出。OP:如果我是你,我会同意@Joe的答案。:)