SAS动态库名称

时间:2012-10-15 14:35:46

标签: sas

我试图弄清楚如何创建动态库引用。我已经想出了如何创建目录,但现在:如何正确创建库引用?

以下代码有效,但需要重复代码。第一个块不会创建引用,但第二个块会创建引用。将它放入循环(执行两次行)不起作用......

我想将此代码重做为宏,以便在调用宏时分配根目录。

提前致谢!

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;

2 个答案:

答案 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提出的最终答案的建议。