创建一个宏,将翻译应用于您在数据集中定义的多个列

Create a macro that applies translate on multiple columns that you define in a dataset

我是 SAS 编程的新手,我想做 2 个宏,这是我做的第一个,它包含 3 个参数:输入名称 table、列名称,输出名称 table。这个宏的作用是翻译稀有字符或重音字符,将其传递给 table 并指定要在哪一列中翻译稀有字符:

执行这个宏的代码是这样的:

%macro translate_column(table,column,name_output);

*%LET table = TEST_MACRO_TRNSLT;
*%let column = marca;
*%let name_output = COSAS;


PROC SQL;
CREATE TABLE TEST AS
SELECT *
FROM &table.;
QUIT;

data &NAME_OUTPUT;
set TEST;
&column.=tranwrd(&column., "Á", "A");
run;
%mend;
%translate_column(TEST_MACRO_TRNSLT,marca,COSAS);

当我尝试执行第二个宏时,问题就来了,我想复制我在第一个宏中所做的,但不是让我可以引入 1 的列,而是让它是无限的,也就是说,如果在一个数据集中我有 4 列字符稀有,你能翻译这 4 列的稀有字符吗?不知道是不是要把之前做的宏放到一个参数里,然后在宏里做个循环之类的。

通过创建一种数组(我没有这方面的经验)并将这些值放入列表(这些将是您要迭代的不同列)或宏变量中,同样如此,可能是将此列表作为函数参数传递有效。

有人可以帮助我吗?非常感谢

使用 ARRAY 或 %DO 循环。

无论哪种情况,都使用 space 分隔的变量名称列表作为宏的 COLUMN 输入参数的值。

%translate_column
(table=TEST_MACRO_TRNSLT
,column=var1 varA var2 varB
,name_output=COSAS
);

所以这是基于 ARRAY 的版本:

%macro translate_column(table,column,name_output);
data &NAME_OUTPUT;
  set &table.;
  array __column &column ;
  do over __column; 
    __column=ktranslate(__column, "A", "Á");
  end;
run;
%mend;

这是基于 %DO 循环的版本

%macro translate_column(table,column,name_output);
%local index name ;
data &NAME_OUTPUT;
  set &table.;
%do index=1 %to %sysfunc(countw(&column,%str( )));
  %let name=%scan(&column,&index,%str( ));
  &name = ktranslate(&name, "A", "Á");
%end;
run;
%mend;

注意我改用 KTRANSLATE() 而不是 TRANWRD。这意味着您可以调整宏以一次处理多个字符替换

&name = ktranslate(&name,'AO','ÁÓ');

ARRAY 版本的优点是无需创建宏即可完成。 %DO 循环版本的优点是它不需要您找到一个名称用于与数据集中任何现有变量名称不冲突的数组。