使用SAS中的正则表达式选择文本文件的特定文本

时间:2016-10-25 12:40:24

标签: sas regular-language

我有以下数据(或类似的东西):

DATA test2;
INPUT STRING $31. ;
PUT STRING;
DATALINES;

James Bond is a spy
Hello World
123 Mill st P BOX 223
11 prospect ave p o box

P Box 225
Hello World
pobox 2212

P. O. box. 256
; 
run;

我想只阅读以“Hello World”开头的行直到下一个空白行,这样我的输出就是

Hello World
123 Mill st P BOX 223
11 prospect ave p o box

Hello World
pobox 2212

我的想法是对这两个(或通常更多)文本中的每一个做一些操作,然后将它们一起添加。但首先我需要过滤掉我需要的文字。请注意我的原始文本文件很大,并且空间来了,我不知道。

我的以下尝试是这样的:

data test3;
 set test2;
 if _n_=1 then do; 
 retain startline endline;
 startline = prxparse('/Hello World/');
 endline = prxparse('/^\s/');
 end;

 if (prxmatch(startline,STRING)=1 or prxmatch(endline,STRING)=1) ;
 run;

它给了我以下输出,但我还需要其余的......:

output

编辑:我应该强调文本中的所有地方都可能是空行,但我只想要 之间的信息 next 空行

2 个答案:

答案 0 :(得分:2)

我想我可以使用此代码获得所需的输出。

 data test3;
 set test2;
 retain outputflag;
 if find(upcase(string),'HELLO WORLD') then outputflag=1;
 if outputflag then output;
 if string='' then outputflag=0;
 run;

答案 1 :(得分:2)

您必须单独检查开始和结束并保留标志。

编辑: 这样,仅输出所需的数据线。连接必须在单独的步骤中完成。

data test3;
 set test2;

 if _n_=1 then do; 
 retain startline endline start ;
 startline = prxparse('/Hello World/');
 endline = prxparse('/^\s/');
 end;

 if prxmatch(endline,STRING)   then start = 0;
 else if prxmatch(startline,STRING) then start = 1;
 if start then output;

 run;

连接:

data test3;
 set test2;

 if _n_=1 then do; 
 retain startline endline start OUTPUT;
 length OUTPUT $3000;
 startline = prxparse('/Hello World/');
 endline = prxparse('/^\s/');
 end;

 if prxmatch(endline,STRING) and OUTPUT ne "" then do; /* check for endline - output string as observation and reset  */
    output;
    start = 0;
    OUTPUT = "";
 end;

 if start then do;
    /* Add text manipulation here */
    OUTPUT = catx(" ",OUTPUT,STRING); /* concat string */
 end;

 if prxmatch(startline,STRING) then start = 1; /* check for startline */

 keep output;

 run;