我有以下数据(或类似的东西):
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;
它给了我以下输出,但我还需要其余的......:
编辑:我应该强调文本中的所有地方都可能是空行,但我只想要
答案 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;