Datei löschen, nur wenn Datei auch vorhanden
Verfasst von SAS-Fidi am 20 Juli, 2010 - 09:19
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
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
»
- Anmelden oder Registrieren um Kommentare zu schreiben

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:
%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:
löscht die SAS Tabellen daten1 und daten2 in der Library 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:
%if %sysfunc(exist(work.zwischen)) %then %do;
proc datasets library=work;delete zwisch dazu test merken chi;run;quit;
%end;
%mend;
VG Guido