Loops SAS:在驱动器或文件夹中的多个SAS程序中搜索多个关键字和术语
我试图在指定驱动器中的多个SAS程序中搜索多个关键字(下面是H:我也希望最终将其放入宏中)。不幸的是,我不可能创建测试文件,但我的示例在Loops SAS:在驱动器或文件夹中的多个SAS程序中搜索多个关键字和术语,loops,syntax,macros,sas,pipe,Loops,Syntax,Macros,Sas,Pipe,我试图在指定驱动器中的多个SAS程序中搜索多个关键字(下面是H:我也希望最终将其放入宏中)。不幸的是,我不可能创建测试文件,但我的示例在H:驱动器上搜索术语print,freq,以及的意思。我创建了一个空数据集search\u results,它将在整个循环中构建 搜索单个术语可以很好地工作,但在多个术语上循环会产生0个观察结果,但没有错误 ** INDIVIDUAL TERM SEARCH WORKS **; filename search pipe 'for /r H: %i in (*
H:
驱动器上搜索术语print
,freq
,以及的意思。我创建了一个空数据集search\u results
,它将在整个循环中构建
搜索单个术语可以很好地工作,但在多个术语上循环会产生0个观察结果,但没有错误
** INDIVIDUAL TERM SEARCH WORKS **;
filename search pipe 'for /r H: %i in (*.sas) do @findstr /i /m "print" "%i"';
data search_results;
infile search length =_len;
input @1 filepath $varying512. _len;
run;
** MACRO LOOP DOES NOT WORK **;
%let search_vars=print freq means;
/* create dataset to append results */
data search_results;
length filepath $512.;
filepath = "";
run;
%macro loop_through(search_vars);
%let n=%sysfunc(countw(&search_vars.));
%do i=1 %to &n.;
%let var=%scan(&search_vars.,&i.);
filename search pipe 'for /r h: %i in (*.sas) do @findstr /i /m "&var." "%i"';
data temp;
infile search length =_len;
input @1 filepath $varying512. _len;
run;
/* append results */
data search_results;
if 0 then modify search_results;
set temp open=defer;
output;
run;
%end;
%mend;
%loop_through(&search_vars.);
我假设它在pipe
语法(可能是引用问题?)中有一些东西,但我对它一点也不熟悉。我的另一个猜测是,它正在以连续的顺序搜索术语print means freq
,而不是实际的循环。有什么见解吗 这可能是因为SAS宏变量不在单引号内解析(”
)
尝试:
您的问题是,您通过使用单引号引用命令抑制了宏变量展开
您可以编写一个更简单的程序,而无需宏代码
data search_results ;
input var $32. ;
length cmd $200 ;
cmd = catx(' ','for /r h: %i in (*.sas) do @findstr /i /m',quote(trim(var)),'"%i"');
infile search pipe filevar=cmd lrecl=512 truncover end=eof ;
do while (not eof);
input filepath $char512. ;
output;
end;
cards;
print
freq
means
;
如果希望在宏变量中而不是在数据文件中传递要搜索的术语列表,则只需使用DO循环来迭代术语列表
data search_results ;
length var $32 cmd $200 ;
do i=1 to countw("&search_terms");
var=scan("&search_terms",i);
cmd = catx(' ','for /r h: %i in (*.sas) do @findstr /i /m',quote(trim(var)),'"%i"');
infile search pipe filevar=cmd lrecl=512 truncover end=eof ;
do while (not eof);
input filepath $char512. ;
output;
end;
end;
stop;
run;
很好地使用嵌入式管道!这很好;但是,cards
语句中的变量会动态地放入宏中,因为它们会定期更改。我知道您可以使用类似于textsolved=dequote(resolve(quote(var))
在cards
语句中使用宏变量,但在此语法中不起作用。有没有办法将术语放入宏变量并在cards
语句中使用?如果不想从文件中读取列表,只需更改外部循环即可<代码>是否i=1以计数(“搜索变量”);var=scan(“&search_vars”,i);。。。结束;停止代码>但是您的方法没有删除外部循环吗?很抱歉,我想我很困惑,因为我原来的方法有一个外循环。删除输入语句的外循环并替换为DO循环。
data search_results ;
length var $32 cmd $200 ;
do i=1 to countw("&search_terms");
var=scan("&search_terms",i);
cmd = catx(' ','for /r h: %i in (*.sas) do @findstr /i /m',quote(trim(var)),'"%i"');
infile search pipe filevar=cmd lrecl=512 truncover end=eof ;
do while (not eof);
input filepath $char512. ;
output;
end;
end;
stop;
run;