我是SAS编程的新手,我想做两个宏,第一个我已经做过了,它包括给出3个参数:输入表的名称、列的名称、输出表的名称。这个宏所做的是翻译稀有字符或重音字符,将一个表传递给它,并指定要翻译稀有字符的列:
执行此宏的代码如下:
%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循环。
在任何一种情况下,都可以使用以空格分隔的变量名列表作为宏的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((而不是TRANRD。这意味着您可以调整宏以同时处理多个字符替换
&name = ktranslate(&name,'AO','ÁÓ');
ARRAY版本的优点是,您可以在不创建宏的情况下执行此操作。%DO循环版本的优点在于,它不需要为数组找到一个与数据集中任何现有变量名称都不冲突的名称。