как заменить строку - PullRequest
       7

как заменить строку

0 голосов
/ 03 февраля 2020

если столбец '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;

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020
case when t1.all CONTAINS  t1.sch
then t1.rep
end

Если вы пропустите оператор 'else', вы получите пропущенные значения (ноль) для нового столбца, если условие не выполняется. если вы хотите сохранить значения t1.all , вы должны добавить оператор else t1.all перед end.

0 голосов
/ 04 февраля 2020

Я предполагаю, что вы хотите преобразовать столбец 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;

Выше код должен быть довольно близок, хотя сейчас я не могу его протестировать. Этот код чувствителен к регистру; Ваши ожидаемые данные предполагают, что вы хотите применить преобразования без учета регистра, в то же время сохраняя регистр остальной части строки. Это немного сложнее реализовать; если это действительно требование, поиск и замена регулярных выражений (prxparse("s/&&sch&i/&&rep&i/");) могут быть лучшим подходом.

Существует также проблема, которую вы хотите заменить 'map_clm', но не 'map_clms', которая также предлагает регулярные выражения может быть самым чистым решением.

В любом случае, этот код дает разумную отправную точку для работы, я думаю. Здорово, что у вас есть встроенные ожидаемые значения для проверки.

Вы действительно изменяете код SQL программно?

...