在SAS中使用压缩和扫描来创建新变量

时间:2018-10-17 15:48:44

标签: sas compression

我是SAS的新手,并且只想使用compress和SCAN将新列中另一列的括号之间的内容保持不变:

 x 
abc(animal)
efg(food)
hij(plant)

我尝试过:

DATA NEW 
    set OLD;
    y = (compress(scan([x], 2, '('), ')');
RUN;
PROC PRINT NEW; 
RUN; 

但是我似乎无法正常工作。任何见解都会有所帮助。

2 个答案:

答案 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。