Die Daten stammen aus einer externen Quelle: die Dateiliste eines Betriebssystemverzeichnisses, abgerufen über den Befehl 'dir' (Windows), der von einem 'filename pipe' ausgeführt wird. Diese Informationen werden anschließend verarbeitet, um ein internes SAS-Dataset zu erstellen oder im Log angezeigt zu werden.
1 Codeblock
MAKRO-DEFINITION & INITIALISIERUNG
Erklärung : Dieser Block definiert das Makro `dirlist` mit seinen Parametern `path` und `outdn`. Er initialisiert auch die Standardwerte dieser Parameter, falls sie nicht angegeben sind. `%superq` wird verwendet, um zu prüfen, ob die Parameter leer sind, ohne sie aufzulösen, was Fehler bei nicht initialisierten Werten vermeidet.
Kopiert!
%macro dirlist(path, outdn);
/*set the defualt value of the required params if the value is null*/
%if %superq(path)= %then %let path=&pdir.data;
%if %superq(outdn)= %then %let outdn=_null_;
1
%macro dirlist(path, outdn);
2
/*set the defualt value of the required params if the value is null*/
3
%IF %superq(path)= %THEN %let path=&pdir.DATA;
4
%IF %superq(outdn)= %THEN %let outdn=_null_;
2 Codeblock
FILENAME PIPE
Erklärung : Diese `filename pipe`-Anweisung ist entscheidend. Sie erstellt ein Fileref namens `filelist`, das, anstatt auf eine physische Datei zu verweisen, einen Betriebssystembefehl (`dir "&path" /o:n /b`) ausführt und dessen Ausgabe als Eingabedatei behandelt. `dir /o:n /b` listet die Dateien im durch `&path` angegebenen Verzeichnis auf (nach Namen geordnet, Rohformat). Es ist wichtig zu beachten, dass 'dir' ein Windows-Befehl ist; für eine Linux-Umgebung (üblich für SAS Viya) müsste ein Befehl wie 'ls' verwendet werden.
Erklärung : Dieser Block ist ein DATA-Step, der die Ausgabe des 'dir'-Befehls über das Fileref `filelist` liest. Jede Zeile der Ausgabe (die einem Dateinamen entspricht) wird in die Variable `fullname` gelesen. Wenn der Parameter `outdn` `_null_` ist, wird `fullname` direkt in das SAS-Log geschrieben. Andernfalls analysiert der Code `fullname`, um die Erweiterung (`extname`) und den Dateinamen ohne Erweiterung (`filename`) zu extrahieren. Die Funktionen `index`, `scan`, `substr`, `length`, `lowcase` und `call missing` werden für diese Analyse verwendet.
Kopiert!
data &outdn;
/*The max length of the name of a PC file is 255*/
length fullname $255 %if &outdn ne _null_ %then filename $255 extname $10 ; ;
infile filelist truncover dlm="|";
input fullname;
%if &outdn=_null_ %then put fullname %str(;) ;
%else %do;
if index(fullname, ".") then do;
extname=lowcase(scan(fullname, -1, '.'));
filename=substr(fullname, 1, length(fullname)-length(extname)-1);
end;
else do;
filename=fullname;
call missing(extname);
end;
%end;
run;
1
DATA &outdn;
2
/*The max length of the name of a PC file is 255*/
Erklärung : Wenn ein Ausgabe-Dataset (`outdn`) angegeben wurde (d.h. nicht `_null_`), führt dieser Block eine `PROC SORT` aus. Diese Prozedur sortiert das durch den DATA-Step erstellte Dataset nach der Variablen `extname` (Dateierweiterung) und organisiert die Dateien somit nach Typ.
Kopiert!
%if &outdn ne _null_ %then %do;
proc sort data=&outdn;
by extname;
run;
1
%IF &outdn ne _null_ %THEN %DO;
2
PROC SORTDATA=&outdn;
3
BY extname;
4
RUN;
5 Codeblock
PROC PRINT
Erklärung : Nach der `PROC SORT` (falls `outdn` nicht `_null_` ist) verwendet dieser Block `PROC PRINT`, um den Inhalt des Datasets `outdn` in der SAS-Ausgabe anzuzeigen. Ein beschreibender Titel wird für die Prozedurausgabe definiert und dann nach der Ausführung entfernt. Dies ermöglicht die direkte Visualisierung der aufgelisteten Dateien und ihrer Details (vollständiger Name, Dateiname, Erweiterung) in der SAS-Ausgabe.
Kopiert!
title "The &path contents";
proc print data=&outdn;
run;
title;
%end;
1
title "The &path contents";
2
PROC PRINTDATA=&outdn;
3
RUN;
4
title;
5
%END;
6 Codeblock
BEREINIGUNG & MAKRO-ENDE
Erklärung : Dieser letzte Block ist für die Bereinigung und das Beenden des Makros verantwortlich. Die Anweisung `filename filelist clear;` gibt das Fileref `filelist` frei, was eine gute Praxis ist, um Konflikte oder unbeabsichtigte spätere Verwendung zu vermeiden. Schließlich markiert `%mend dirlist;` das Ende der Definition des Makros `dirlist`.
Kopiert!
filename filelist clear;
%mend dirlist;
1
filename filelist clear;
2
%mend dirlist;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Name : dirlist.sas
Author: Jun Fang June, 2016
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.