Die SAS-Methode zum Durchlaufen einer Tabelle außerhalb eines Datenschritts
Ich frage mich, wie man am saubersten eine Makroschleife über eine Datentabelle außerhalb eines Datenschritts ausführt , um beispielsweise Dateien aus der Tabelle einzulesen have
und für jede der Dateien eine komplexe Analyse durchzuführen.
Angenommen, wir haben eine Tabelle have
mit einer Reihe von Dateinamen und anderen Metadaten:
N filename purpose
1 foo.xls Blue team data
2 bar.xls Read team data
Ich dachte an so etwas
%local lines current_file current_purpose;
proc sql noprint;
select count(*) into: lines from have;
quit;
%do I=1 %to &lines.;
%put --- Process file number &I. ---;
data _null_;
set have;
if _n_=&I. then do;
call symput('current_file',filename);
call symput('current_purpose',purpose);
end;
run;
%put --- ¤t_file. contains &purpose.;
/* Here comes the actual analysis */
%end;
Ist das der Weg, wie es geht? Für mich sieht das nicht so einfach aus.
Verwandte Fragen:
- SAS-Schleife durch Datensätze
- SAS let-Anweisung: Verweisen auf einen Zellenwert?
Antworten
Wenn Sie also einen Makronamen ANALYSIS mit den Eingabeparametern FILENAME und PURPOSE definiert haben.
%macro analysis(filename,purpose);
/* Here comes the actual analysis */
title &purpose ;
proc import datafile="&filename" ....
%mend;
Anschließend können Sie mithilfe eines Datenschritts für jede Beobachtung einen Aufruf des Makros generieren. Sie können CALL EXECUTE verwenden, aber ich finde es klarer und einfacher zu debuggen, einfach den Code in eine Datei zu schreiben und ihn dann% INCLUDE. Insbesondere, wenn der Parametername mit dem Variablennamen in den Metadaten übereinstimmt, die zur Steuerung der Codegenerierung verwendet werden.
Also dieser Schritt:
filename code temp;
data _null_;
set have;
file code;
put '%analysis(' filename= ',' purpose= :$quote. ')' ;
run;
Erzeugt ein Programm wie:
%analysis(filename=foo.xls,purpose="Blue team data")
%analysis(filename=bar.xls,purpose="Red team data")
Welche können Sie dann mit ausführen
%include code / source2;