我试图弄清楚如何创建动态库引用。我已经想出了如何创建目录,但现在:如何正确创建库引用?
以下代码有效,但需要重复代码。第一个块不会创建引用,但第二个块会创建引用。将它放入循环(执行两次行)不起作用......
我想将此代码重做为宏,以便在调用宏时分配根目录。
提前致谢!
data _null_;
rootdir='c:/temp';
dir1=put(today(),yymmddn8.);
dir2='Individual';
dir3='Household';
newdir1=dcreate(dir1,rootdir);
newdir2=dcreate(dir2,newdir1);
newdir3=dcreate(dir3,newdir1);
lname=catx('/',rootdir,dir1,dir2);
lname2=catx('/',rootdir,dir1,dir3);
call symput('ln1',lname);
call symput('ln2',lname2);
libname Indiv "&ln1";
libname HH "&ln2";
run;
data _null_;
rootdir='c:/temp';
dir1=put(today(),yymmddn8.);
dir2='Individual';
dir3='Household';
lname=catx('/',rootdir,dir1,dir2);
lname2=catx('/',rootdir,dir1,dir3);
call symput('ln1',lname);
call symput('ln2',lname2);
libname Indiv "&ln1";
libname HH "&ln2";
run;
答案 0 :(得分:0)
libname不需要在datastep中执行;这是一个开放的代码声明。因此,您的代码可以简单地运行datastep,然后运行libname语句,即
data _null_;
rootdir='c:/temp';
dir1=put(today(),yymmddn8.);
dir2='Individual';
dir3='Household';
newdir1=dcreate(dir1,rootdir);
newdir2=dcreate(dir2,newdir1);
newdir3=dcreate(dir3,newdir1);
lname=catx('/',rootdir,dir1,dir2);
lname2=catx('/',rootdir,dir1,dir3);
call symput('ln1',lname);
call symput('ln2',lname2);
run;
libname Indiv "&ln1";
libname HH "&ln2";
实际上,任何一个都不需要数据步骤...
%let dir1=%sysfunc(today(),YYMMDDN8.);
%let dir2=Individual;
%let dir3=Household;
%let ln1=c:/temp/&dir1./&dir2.;
%let ln2=c:/temp/&dir1./&dir3.;
x "md &ln1.";
x "md &ln2.";
libname Indiv "&ln1.";
libname HH "&ln2.";
您甚至不必创建ln1和ln2,您可以直接将libname分配给ln1和ln2的文本。我还添加了目录创建语句,以明确它将如何交互(如果你使用它,你应该使用中间的ln1 / ln2)。
答案 1 :(得分:0)
%macro libs(rootdir);
data _null_;
dir1=put(today(),yymmddn8.);
dir2='Individual';
dir3='Household';
newdir1=dcreate(dir1,&rootdir);
newdir2=dcreate(dir2,newdir1);
newdir3=dcreate(dir3,newdir1);
call symput('ln1',catx('/',&rootdir,dir1,dir2));
call symput('ln2',catx('/',&rootdir,dir1,dir3));
run;
libname Indiv "&ln1";
libname HH "&ln2";
%mend libs;
%libs("c:/temp")
似乎要做的伎俩。不确定是否是最有效的方式,但至少它是一种方式。感谢Joe提出的最终答案的建议。