SAS Programm zum Auslesen eines Verzeichnisses

15. Januar 2024

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;

Beispielausgabe:

SAS Programm zum Auslesen eines Verzeichnisses Oliver Pitzius
cross-circleCookie Consent Banner von Real Cookie Banner