我是SAS的新手,并且只想使用compress和SCAN将新列中另一列的括号之间的内容保持不变:
x
abc(animal)
efg(food)
hij(plant)
我尝试过:
DATA NEW
set OLD;
y = (compress(scan([x], 2, '('), ')');
RUN;
PROC PRINT NEW;
RUN;
但是我似乎无法正常工作。任何见解都会有所帮助。
答案 0 :(得分:3)
@tom答案很完美,另一种方法是使用prxsubstr。
data have;
input x $20.;
datalines;
abc(animal)
efg(food)
hij(plant)
;
prxparse \(.+?\) is to find anything between parenthesis
\( -- starting of parenthesis
.+?\( --- anything till closing parenthesis
调用prxsubstr捕获其找到样式和长度的位置。 然后执行substr以获取括号内的值
data want;
set have;
if _n_= 1 then do;
retain re;
re = prxparse('/\(.+?\)/');
end;
call prxsubstr(re, trim(x), position, length);
if position gt 0 then
new=substr(trim(x),position+1, length-2);
run;
答案 1 :(得分:2)
除非您要从提取的值中删除一些其他字符,否则不需要compress()
。您可能想使用left()
从xxx( yyy )
之类的值中删除前导空格。
y=scan(x,2,'()');
如果您有诸如(no first word)
之类的值,则可能需要使用索引1而不是2。如果是这样,您可以使用=:
测试X是否以开放的括号开头。
y=scan(x,1+(x^=:'('),'()');
如果您知道()始终在末尾,则可以使用索引-1。但是,如果某些字符串在关闭括号后有字符,那么您将需要使用-2。