News Artikel Foren Join Projekte List Links Random Über Redscope Previous Next Startseite › Foren › Allgemeine Fragen zu SAS Datei löschen, nur wenn Datei auch vorhanden 20 July, 2010 - 10:19 — SAS-Fidi 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 Foren: Allgemeine Fragen zu SAS Log in or register to post comments Datei löschen, nur wenn Datei auch vorhanden 20 July, 2010 - 10:32 — Armageddon 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 Log in or register to post comments Makro zum kontrollierten löschen von Dateien aus einer 22 July, 2010 - 23:02 — dolic 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 Log in or register to post comments