Sas 如何替换字符串

Sas 如何替换字符串,sas,sas-macro,Sas,Sas Macro,如果列“all”包含列“sch”中的字符串,则此字符串将替换为“rep”中的字符串。“new_all”专栏正是我所期待的 data a0; input sch $9. rep $14. ; cards; map_clm map_claim xyz_ttt xyz drug_clm drug_clm_test fee_sch fee_sch_test ; run; data a1; input all $26. new_all $30.; cards; from abc.xyz_

如果列“all”包含列“sch”中的字符串,则此字符串将替换为“rep”中的字符串。“new_all”专栏正是我所期待的

data a0;
input sch $9. rep $14. ;
cards;
map_clm  map_claim
xyz_ttt  xyz    
drug_clm drug_clm_test 
fee_sch  fee_sch_test
;
run;

data a1;
input all $26. new_all $30.;
cards;
from abc.xyz_ttt d2 left from abc.xyz d2 left
D1.Xwlk,abc.xyz_TTT left D1.xwlk,abc.xyz left
d1.x,abc.map_clms,d2.dos d1.x,abc.map_clms,d2.dos
ABC.XYZ_Ttt left join d1 ABC.xyz left join d1
,tt.drug_CLM, tt.Xyz_ttt ,tt.drug_clm_test, tt.xyz
d3.DOS,t2.fee_SCH,tt.day fd3.DOS,t2.fee_sch_test,tt.day
;
run;

我假设您希望将列all转换为列new_all,使用a0数据集中的值来描述/控制转换

%macro do_it;

* Set up some macro variable arrays to hold the from/to pairs;
data _null_;
  set a0 end=end;
  call symput("sch" || _n_, sch);
  call symput("rep" || _n_, rep);
  if end then call symput("max", _n_);
run;

* Process the data;
data want;
  length new_all_new $ 200;
  set a1;

  * Copy the incoming value to the output;
  new_all_new = all;

  * Apply each of the transformations in turn;
  %do i = 1 %to &max;
    new_all_new = tranwrd(new_all_new, "&&sch&i", "&&rep&i");
  %end;

  * Did we get the expected value?;
  if new_all_new ne new_all then do;
    put "ERROR: Did not get expected value: " all= new_all= new_all_new=;
  end;

run;

%mend;

%do_it;
上面的代码应该非常接近,尽管我目前无法测试它。此代码区分大小写;您预期的数据表明您希望不敏感地应用转换大小写,同时保留字符串其余部分的大小写。实施起来有点棘手;如果确实需要,则使用正则表达式搜索并替换prxparses/&&sch&i/&&rep&i/;这可能是最好的办法

还有一个问题,您希望替换“map\u clm”,而不是“map\u clms”,这也表明正则表达式可能是最干净的解决方案

无论如何,我认为,这段代码为您提供了一个合理的起点。很好,您有内置的预期值可供测试

您真的在以编程方式修改SQL代码吗

case when t1.all CONTAINS  t1.sch
then t1.rep
end

如果跳过'else'语句,如果不满足条件,则新列的缺失值将为null。如果要保留t1.all值,则必须在结束前添加else t1.all语句。

您的问题不清楚,请重新格式化并重新格式化以提高清晰度。您是否询问如何修改all的值,以便将SCH中包含的单词引用替换为REP中的单词?请在输入的情况下显示您的预期输出。这不仅仅是sch=rep;替换?抱歉搞混了。刚刚更新。Tom,是的,如果'all'包含'sch'中的字符串,则使用'rep'中的字符串替换此字符串。我使用了prxchanges/&&sch&i/&&rep&i/,-1,all,效果很好。谢谢Chris Long!没问题。如果你同意这个答案,请把它标记为你接受的答案。你是对的,他的代码只是一个草稿,需要做很多工作。谢谢