Pipe-Funktion Directory mit Blanks
ETL & Base SAS |
Eingetragen von uefa1997. | 14 Dezember, 2007 - 11:28
Hallo zusammen,
ich habe ein kleines SAS-Macro geschrieben zur Dokumentation unserer SAS-Programme. In diesem Macro-Programm geschieht in kurzen Worten folgendes:
Es wird jeweils dokmentiert (d.h. in eine SAS-Tabelle rausgeschrieben), wann welches Programm von welchem Anwender erstellt, zuletzt modifiziert und zuletzt abgeschickt wurde).
Hier der Quelltext:
/* Macro zur Programm-Dokumentation */
%macro documentation (autor, anwender, datum_erst_erstellung, version, sparte, projekt, beschreibung);
libname doku 'u:\dokumentation';
%global pprogpath ppnamefull ppath;
%let pprogpath =;
%let ppnamefull =;
%let ppath =;
data _null_;
set sashelp.vextfl;
if (substr(fileref,1,3)='_LN' or substr
(fileref,1,3)='#LN' or substr(fileref,1,3)='SYS') and
index(upcase(xpath),'.SAS') > 0 then do;
call symput("pprogpath",trim(xpath));
end;
run;
%let ppnamefull = %scan(&pprogpath,-1,\/);
%let ppath = %substr(&pprogpath, 1, %index(&pprogpath,&ppnamefull)-1);
filename foo1 pipe "dir &ppath.&ppnamefull. /t:c /a:-d ";
data test_1;
infile foo1 firstobs=6;
input cr_date $ 1-10 cr_time $ 13-17;
if cr_date eq " " then stop;
run;
proc sql noprint;
select cr_date into : cr_date
from test_1;
quit;
proc sql noprint;
select cr_time into : cr_time
from test_1;
quit;
proc delete data = test_1;
run;
filename foo2 pipe "dir &ppath.&ppnamefull. /t:w /a:-d";
data test_2;
infile foo2 firstobs=6;
input mod_date $ 1-10 mod_time $ 13-17;
if mod_date eq " " then stop;
run;
proc sql noprint;
select mod_date into : mod_date
from test_2;
quit;
proc sql noprint;
select mod_time into : mod_time
from test_2;
quit;
proc delete data = test_2;
run;
data work.doku;
format programm_name $200.;
format sparte $100.;
format projekt $200.;
format autor $50. ;
format anwender $50. ;
format pfad_name $250.;
format datum_erst_erstellung $10. ;
format zeit_erst_erstellung $5. ;
format datum_mod $10. ;
format zeit_mod $5. ;
format datum_letzter_lauf $10. ;
format zeit_letzter_lauf $5. ;
format version $4. ;
format beschreibung $255.;
programm_name = "&ppnamefull.";
sparte = "&sparte.";
projekt = "&projekt.";
autor = "&autor.";
%if "&anwender." = "" %then %do;
anwender = "&autor.";
%end;
%else %do;
anwender = "&anwender.";
%end;
pfad_name = "&ppath.";
datum_erst_erstellung = "&cr_date.";
datum_erst_erstellung = trim(substr(datum_erst_erstellung,7,4)||"-"||substr(datum_erst_erstellung,4,2)||"-"||substr(datum_erst_erstellung,1,2)) ;
zeit_erst_erstellung = "&cr_time.";
datum_mod = "&mod_date.";
datum_mod = trim(substr(datum_mod,7,4)||"-"||substr(datum_mod,4,2)||"-"||substr(datum_mod,1,2)) ;
zeit_mod = "&mod_time.";
version = "&version.";
datum_letzter_lauf = "%sysfunc(date(),YYMMDD10.)";
zeit_letzter_lauf = "%sysfunc(time(),time8.)";
beschreibung = "&beschreibung.";
label programm_name = "Programm-Name"
sparte = "Sparte"
projekt = "Projekt-Name"
autor = "Autor"
anwender = "Anwender"
pfad_name = "Pfad-Name des Programms"
datum_erst_erstellung = "Datum der ersten Erstellung"
zeit_erst_erstellung = "Zeit der ersten Erstellung"
datum_mod = "Datum der letzten Modifizierung"
zeit_mod = "Zeit der letzten Modifizierung"
datum_letzter_lauf = "Datum des letzten Laufes"
zeit_letzter_lauf = "Zeit des letzten Laufes"
version = "Versions-Nummer des Programms"
beschreibung = "Beschreibung des Programms"
;
run;
proc append base = doku.doku_total
data = work.doku force;
run;
proc sort data = doku.doku_total;
by descending datum_letzter_lauf descending zeit_letzter_lauf;
run;
proc delete data = work.doku;
run;
%mend documentation;
%documentation (autor = Roman Kolbe,
anwender = ,
version = 1.0,
sparte = Test,
projekt = Testprojekt,
beschreibung = Beschreibungstext
);
Immer dann, wenn allerdings in dem Windows-Pfad, in dem das Programm abgespeichert worden ist, Blanks stehen, funktioniert die DIR-Anweisung in der PIPE-Funktion nicht. Ohne Blanks im Namen des Verzeichnisses läuft das Macro einwandfrei.
Hat jemand eine Idee, woran das liegen könnte bzw. einen Lösungsvorschlag?
Vielen Dank im voraus.
Gruß Roman Kolbe
