Datei löschen, nur wenn Datei auch vorhanden

Werbung
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
Herunterladen