在SAS 9.2中解析包含“|”的字符串字符

时间:2013-12-06 18:09:40

标签: regex sas

我有一个变量,其中包含由|分隔的多个公司符号。我希望能算出那里有多少家公司。即,|的数量+ 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;

2 个答案:

答案 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,"|");

我希望有所帮助!