从sas中的char变量中删除特定的字符串

时间:2018-10-04 03:00:33

标签: sas

我正在尝试从sas的var中删除字符串。

Data test;
a='27,7,37';
b=7;
c=trnwrd(a,strip(put(b,2.)),'');
run;

我只想从字符串a中除去第二个7,而不是从27,37中除去7。 我该如何实现? 谢谢

2 个答案:

答案 0 :(得分:0)

使用tranwrd代替transtrn,将第三个参数(替换)用作trimN('')返回的零长度字符串

c = transtrn ( a, cats(',',b), trimN(''));

翻译可能会“太强大”。例如,如果a="1,7,7,7,727"; transtrn将消除所有 ,7次出现。

使用PRXCHANGE

可以实现更强大的匹配和替换
Data test;
array s [10] $100 _temporary_ (
  '27,7,37'
, '27,7,7,7,7,7,737' 
, '27,7'                %* <------ prxchange does not remove ,7 -- PCRE should! bug in SAS ? ;
, '27,77'
, ',7,4,5,6'
, ',7,7,7,7'
);

b = 7;

length patternTemplate $50;
patternTemplate = 's/^([^,]*),(#b#)($|,)/$1$3/';
pattern = tranwrd (patternTemplate, '#b#', cats(b));

put /pattern=/;

do i = 1 to dim(s) while (not missing(s[i]));

  a = s[i];

  c = prxchange(pattern,1,a);
  put a=/c=/;

  output

end;
run;

答案 1 :(得分:0)

您可以按以下方式使用prxchange

data test;
length a $50.;
a='27,7,37';output;
a='7,7,7';output;
 a='7,97,7';output;
 a='44,7,57,78,79,66';output;
 run;

在下面的代码中

    ^(\d+) indicates first starting number a
    (\,7)  -- indicates  second number 
     (.+) -- everything after second number

第一个和最后一个部分被捕获为$ 1和$ 3被替换,这意味着我们要删除第二个7.如果找不到此模式,它什么也不做

 data want;
 set test;
 a1=prxchange('s/^(\d+)(\,7)(.+)/$1$3/',1, a);
 run;