Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops SAS:在驱动器或文件夹中的多个SAS程序中搜索多个关键字和术语_Loops_Syntax_Macros_Sas_Pipe - Fatal编程技术网

Loops SAS:在驱动器或文件夹中的多个SAS程序中搜索多个关键字和术语

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 (*

我试图在指定驱动器中的多个SAS程序中搜索多个关键字(下面是H:我也希望最终将其放入宏中)。不幸的是,我不可能创建测试文件,但我的示例在
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;