%let st1 = a b c;
搜索/替換宏變量
我願做一個查找/替換來得到這樣
%let st2 = a_b_c;
或
%let st3 = a%b%c;
或
%let st3 = a!!b!!c;
基本上只是更換某些炭與
_
或%
或!!
。
我認爲prxchange
是最快的方法(甚至比tranwrd
更快)。但我正在爲它的語法而努力。
這是我曾嘗試
%put %sysfunc(prxchange(s/(\w+)/\1_/,-1,%bquote(&st1)));
%let st1 = a b c;
搜索/替換宏變量
我願做一個查找/替換來得到這樣
%let st2 = a_b_c;
或
%let st3 = a%b%c;
或
%let st3 = a!!b!!c;
基本上只是更換某些炭與
_
或%
或!!
。
我認爲prxchange
是最快的方法(甚至比tranwrd
更快)。但我正在爲它的語法而努力。
這是我曾嘗試
%put %sysfunc(prxchange(s/(\w+)/\1_/,-1,%bquote(&st1)));
正則表達式需要一些工作。我已根據您的要求更改了正則表達式,即! _%需要空間更新。
%let st1 = a b c;
%let st2 = a_b_c;
%let st3 = %nrstr(a%b%c);
%let st4 = a!!b!!c;
%put %sysfunc(prxchange(s/[\_\!\%]/ /,-1,%bquote(&st2)));
%put %sysfunc(prxchange(s/[\_\!\%]/ /,-1,%bquote(&st3)));
%put %sysfunc(prxchange(s/[\_\!\%]/ /,-1,%bquote(&st4)));
希望得到這個幫助。謝謝!!
UPDATE:
提供更新prxchange功能來代替!與單個空間。另外,替換髮生從左到右。我們不能從右向左做。
%let st1 = a b c;
%let st2 = a_b_c;
%let st3 = %nrstr(a%b%c);
%let st4 = a!!b!!c;
%put %sysfunc(prxchange(s/([\_\%])|(!!)/ /,-1,%bquote(&st2)));
%put %sysfunc(prxchange(s/([\_\%])|(!!)/ /,-1,%bquote(&st3)));
%put %sysfunc(prxchange(s/([\_\%])|(!!)/ /,-1,%bquote(&st4)));
請注意,最後一個不等於前兩個。因爲你用'__'替換'!!',而不是'_'。 – Lovnlust
爲什麼性能是一個問題呢?如果你正在用這麼多的宏變量來做這件事,那麼你可能會注意到一個數據步驟方法值得考慮的問題呢? – user667489
不是一個問題。只是好奇處理這種事情的有效方法。 – Lovnlust