0

動的ライブラリ参照を作成する方法を理解しようとしています。ディレクトリを作成する方法を理解しましたが、ライブラリ参照を適切に作成するにはどうすればよいですか?

以下のコードは機能しますが、コードを繰り返す必要がありました。最初のブロックは参照を作成しませんが、2 番目のブロックは作成します。同じものをループに入れて(行を2回実行するために)機能しません...

このコードをマクロに書き直して、マクロを呼び出すときにルート ディレクトリが割り当てられるようにします。

前もって感謝します!

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;
4

2 に答える 2

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")

トリックを行うようです。それを行う最も効率的な方法かどうかはわかりませんが、少なくともそれは方法です。最終的な答えに導いてくれた提案をしてくれたジョーに感謝します。

于 2012-10-15T23:49:36.483 に答える
0

libname はデータステップで実行する必要はありません。それはオープンコードステートメントです。したがって、コードは単純に 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 を作成する必要さえありません。ln1 と ln2 になるテキストに libname を直接割り当てることができます。ディレクトリ作成ステートメントも追加して、それがどのように相互作用するかを明確にしました (それを使用する場合は、中間の ln1/ln2 を使用する必要があります)。

于 2012-10-15T14:53:08.953 に答える