2016-09-23 2 views
1

Ich versuche, mehrere Schlüsselwörter in mehreren SAS-Programmen in einem angegebenen Laufwerk zu suchen (unten ist H: und ich möchte auch irgendwann setzen dies in einem Makro). Leider ist es mir unmöglich, Testdateien zu erstellen, aber mein Beispiel sucht nach den Begriffen print, freq und means auf dem Laufwerk H:. Ich erstelle einen leeren Datensatz search_results, der während der Schleife erstellt wird.SAS: Suche nach mehreren Schlüsselwörtern und Begriffen in mehreren SAS-Programmen in Laufwerk oder Ordner

Suche nach einzelnen Begriffen funktioniert gut, aber das Umkehren mehrerer Begriffe ergibt 0 Beobachtungen, aber keine Fehler.

** 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.); 

Ich nehme an, es ist etwas mit der pipe Syntax (vielleicht Fragen zitieren?), Aber ich bin nicht vertraut mit ihm. Meine andere Vermutung ist, dass es nach den Begriffen in fortlaufender Reihenfolge print means freq statt einer tatsächlichen Schleife sucht. Irgendeine Einsicht?

Antwort

2

Ihr Problem ist, dass Sie die Makrovariable Expansion durch die Verwendung einfache Anführungszeichen unterdrückt Ihren Befehl zu zitieren.

Sie können ein viel einfacheres Programm ohne den Makrocode schreiben.

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 
; 

Wenn Sie in der Liste der Bedingungen weitergeben wollen in einer Makrovariablen suchen statt einer Datendatei dann nur eine DO-Schleife über die Liste von Begriffen zu durchlaufen.

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; 
+0

netter Gebrauch des eingebetteten Rohres! –

+0

Das ist nett; Die Variablen in der Anweisung 'cards' werden jedoch dynamisch in ein Makro eingefügt, da sie sich periodisch ändern. Ich weiß, dass Sie etwas wie 'textResolved = dequote (resolve (quote (var)));' verwenden können, um Makrovariablen in der 'cards' Anweisung zu verwenden, aber es funktioniert nicht in dieser Syntax. Gibt es eine Möglichkeit, die Begriffe in eine Makrovariable zu setzen und diese in der "cards" -Anweisung zu verwenden? – Foxer

+0

Wenn Sie die Liste nicht aus einer Datei lesen möchten, ändern Sie einfach die äußere Schleife. 'do i = 1 to countw (" & search_vars "); var = scan ("& search_vars", i); ... end; stop; ' – Tom

0

Es war wahrscheinlich aufgrund der Tatsache, dass SAS-Makrovariablen nicht in einfache Anführungszeichen auflösen (').

Versuchen:

%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.); 
      /* modified here */ 
      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.); 
Verwandte Themen