Haben Sie sich auch schon gefragt, wie Sie Verzeichnisse mit Hilfe von SAS auslesen können ohne, dass Sie Berechtigungen für ein Filename-Statement mit Pipe-Option haben?
Dieses SAS Programm nutzt einen Data-Step um das Verzeichnis aus der Makrovariablen Path auszulesen und Informationen wie z.B.
- Dateiname
- Dateiendung
- Pfad inklusive Dateinamen
- Datum der letzten Änderung
- Erstelldatum
bereit zu stellen.
PROC FORMAT;
INVALUE MONZUZAHL
"Januar" = 1
"Februar" = 2
"März" = 3
"April" = 4
"Mai" = 5
"Juni" = 6
"Juli" = 7
"August" = 8
"September" = 9
"Oktober" = 10
"November" = 11
"Dezember" = 12
other = .;
RUN;
Dieses in diesem Proc-Format-Step erstellte Informat dient dazu, die ausgelesenen Datumswerte (String mit deutschen Monatsnamen. Bei englischen Systemen gibt es andere Möglichkeiten) in SAS Datumswerte (Zahl) umzuwandeln.
%LET PATH = 'XXX592\';
An dieser Stelle einfach den Pfad des auszulesenden Verzeichnisses angeben.
data DIRCONTENTS;
keep Verzeichnis Dateiname Endung PfadundName LetzteAendDat AENDDAT ErstellDat ERSTDAT;
length Verzeichnis $40 fref $8 Dateiname $80 Endung $30
PfadundName $200 LetzteAendDat $40 ErstellDat $40
;
rc = filename(fref, &PATH);
if rc = 0 then
do;
did = dopen(fref);
rc = filename(fref);
end;
else
do;
length msg $200.;
msg = sysmsg();
put msg=;
did = .;
end;
if did <= 0 then
putlog 'ERR' 'OR: Unable to open directory.';
dnum = dnum(did);
do i = 1 to dnum;
Verzeichnis = &PATH;
Dateiname = dread(did, i);
Endung = LOWCASE(SUBSTR(Dateiname,Find(Dateiname,".")+1));
/* Ausgabe falls Eintrag eine Datei ist. Falls eintrag ein Unterverzeichnis, nicht ausgeben.*/
fid = mopen(did, Dateiname);
/* Pfad und Dateiname */
opt=FOPTNAME(fid,1);
PfadundName=FINFO(fid,upcase(opt));
/* Letzte Änderung */
opt=FOPTNAME(fid,5);
LetzteAendDat=STRIP(FINFO(fid,upcase(opt)));
AENDDAT=MDY (INPUT(SCAN(LetzteAendDat,2),MONZUZAHL.),Substr(LetzteAendDat,1,2),SCAN(LetzteAendDat,3));
/* Erstelldatum */
opt=FOPTNAME(fid,6);
ErstellDat=FINFO(fid,upcase(opt));
ERSTDAT = MDY (INPUT(SCAN(ErstellDat,2),MONZUZAHL.),Substr(ErstellDat,1,2),SCAN(ErstellDat,3));
if fid > 0 then
output;
end;
rc = dclose(did);
Format AENDDAT ERSTDAT DEUDFDD10.;
LABEL
AENDDAT="Datum der letzten Änderung"
ERSTDAT="Erstelldatum"
;
run;