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?
netter Gebrauch des eingebetteten Rohres! –
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
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