Datei löschen, nur wenn Datei auch vorhanden

Ich habe am Anfang eines Macro folgendes stehen:

proc datasets library=work;delete zwisch dazu test merken chi;run;quit;

Die Dateien, die hier gelöscht werden, stammen aus vorherigen Aufrufen des gleichen Macros.

Wird das Macro nun das erste Mal aufgerufen, sind diese Dateien damit noch nicht vorhanden und es kommt zu folgender Fehlermeldung:

NOTE: The file WORK.ZWISCH (memtype=DATA) was not found, but appears on a
DELETE statement.
NOTE: The file WORK.DAZU (memtype=DATA) was not found, but appears on a DELETE
statement.
NOTE: The file WORK.TEST (memtype=DATA) was not found, but appears on a DELETE
statement.
NOTE: The file WORK.MERKEN (memtype=DATA) was not found, but appears on a
DELETE statement.
NOTE: The file WORK.CHI (memtype=DATA) was not found, but appears on a DELETE

Diese Meldung möchte ich nun vermeiden. Das proc datasets soll also nur aufgerufen werden, wenn es die Dateien schon gibt. Wie mache ich das am besten?

VG SAS-Fidi

Makro zum kontrollierten löschen von Dateien aus einer LIB

Hallo.

Da SAS Base ja nicht selber hinter sich aufräumt, auf Servern der Workspace aber oft gemeinsam von vielen Usern genutzt wird, gehört das Aufräumen zum guten Ton :-)
Hier ein Makro, mit dem das gelöst wird, welches auch Dein Problem löst:

%macro clean_lib(lib, dsn=);
%local _todelete cc w;

%let w = WARNING:;
%if %sysfunc(getoption(locale)) = GERMAN_GERMANY %then %do;
%let w = WARNUNG:;
%end;

%if &dsn eq %then %do;
proc sql noprint;
select distinct memname into :dsn separated by " "
from dictionary.tables
where upcase(libname) = "%upcase(&lib)"
;
quit;
%end;

%let cc = 1;
%do %while(%scan(&dsn, &cc, %str( )) ne );
%let thisdsn = %scan(&dsn, &cc, %str( ));
%if %sysfunc(exist(&lib..&thisdsn)) %then %do;
%let _todelete = &_todelete &thisdsn;
%end;
%let cc = %eval(&cc + 1);
%end;

%if &_todelete eq %then %do;
%put &w Nothing to delete.;
%goto exit;
%end;

proc datasets library = &lib nodetails nolist memtype = (data view);
delete &_todelete;
quit;

%exit:
%mend clean_lib;

Einige Beispiele:

%clean_lib(work, dsn = daten1 daten2)

löscht die SAS Tabellen daten1 und daten2 in der Library WORK.

%clean_lib(work)

Löscht alle Dateien in der Library WORK.

Vorteil: das Makro löscht nur Dateien, die wirklich vorhanden sind und es ist für jede zugewiesene Bibliothek einsetzbar. Es löscht sowohl Tabellen als auch Views.

Gadget: ist ein Verzeichnis leer, erscheint eine Fehlermeldung. Die typische Einfärbung im SAS-Log Display Manager funktioniert in der englischen und der deutschen SAS Version.

Optimierung:
Die DICTIONARY TABLES sind in großen Umgebungen sehr langsam. Alternative: PROC DATASETS mit ODS OUTPUT. Erzeugt aber in jedem Fall einen Listing (oder anderen) Print Output. Ist aber auch wesentlich schneller!

Viel Spass

Dubro

Datei löschen, nur wenn Datei auch vorhanden

das folgende Makro könnte die gewünschte Aufgabe übernehmen:

%macro _delete_;
%if %sysfunc(exist(work.zwischen)) %then %do;
proc datasets library=work;delete zwisch dazu test merken chi;run;quit;
%end;
%mend;

VG Guido