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