Sposób sygnatury dostępu Współdzielonego do pętli nad tabelą poza krokiem danych
Zastanawiam się, jaki jest najczystszy sposób na wykonanie pętli makr na tabeli danych poza krokiem danych, aby np. Wczytać pliki z tabeli have
i przeprowadzić złożoną analizę dla każdego z plików.
Załóżmy, że mamy tabelę have
zawierającą zestaw nazw plików i inne metadane:
N filename purpose
1 foo.xls Blue team data
2 bar.xls Read team data
Myślałem o czymś takim
%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;
Czy to jest sposób, jak to zrobić? Dla mnie to nie wygląda na najprostszy sposób.
Powiązane pytania:
- Pętla SAS przez zestawy danych
- Oświadczenie SAS let: odnosi się do wartości komórki?
Odpowiedzi
Jeśli więc zdefiniowałeś nazwę makra ANALIZA z parametrami wejściowymi NAZWA PLIKU i CEL.
%macro analysis(filename,purpose);
/* Here comes the actual analysis */
title &purpose ;
proc import datafile="&filename" ....
%mend;
Następnie możesz użyć kroku danych, aby wygenerować jedno wywołanie makra dla każdej obserwacji. Możesz użyć CALL EXECUTE, ale uważam, że jaśniejsze i łatwiejsze do debugowania jest po prostu zapisanie kodu do pliku, a następnie% INCLUDE. Zwłaszcza, gdy nazwa parametru jest zgodna z nazwą zmiennej w metadanych używanych do generowania kodu.
Więc ten krok:
filename code temp;
data _null_;
set have;
file code;
put '%analysis(' filename= ',' purpose= :$quote. ')' ;
run;
Wygeneruje program taki jak:
%analysis(filename=foo.xls,purpose="Blue team data")
%analysis(filename=bar.xls,purpose="Red team data")
Które możesz następnie uruchomić za pomocą
%include code / source2;