我经常需要分配(和取消分配)临时的librefs / filerefs作为实用程序宏的一部分-因此,我需要避免与任何现有的librefs / filerefs命名冲突。我知道我可以查询sashelp或字典表,并使用条件逻辑进行迭代,直到找到未分配的表,但是我想知道是否有更简单的方法?
例如,以下代码将在工作库中创建一个唯一命名的数据集:
data;run;
librefs / filerefs是否有等效项?
答案 0 :(得分:2)
FILENAME()函数已经提供了一种方法。当您使用fileref的缺失值调用它时,它会使用#LNnnnnn格式生成一个。
nm1 <- names(DT)[-1] #or change the names accordingly
答案 1 :(得分:1)
实际上写一个相当简单,并且不涉及查询(昂贵的)字典表:
libname mcore0 (work);
libname mcore1 (work);
libname mcore2 (work);
%macro mf_getuniquelibref(prefix=mcore,maxtries=1000);
%local x;
%let x=0;
%do x=0 %to &maxtries;
%if %sysfunc(libref(&prefix&x)) ne 0 %then %do;
%put Libref &prefix&x is available!;
&prefix&x
%return;
%end;
%end;
%put unable to find available libref in range &prefix.0-&maxtries;
%mend;
%let libref=%mf_getuniquelibref();
%put &=libref;
返回;
更新:
我已将这两个宏添加到MacroCore库中,可以按以下方式使用它们:
filename mc url "https://raw.githubusercontent.com/Boemska/macrocore/master/macrocore.sas";
%inc mc;
%let libref=%mf_getuniquelibref();
%let fileref=%mf_getuniquefileref();
答案 2 :(得分:1)
在公开执行空间中调用的未记录的monotonic
函数非常有用,可以获取未使用的值。
libname mylib "C:\temp\sandbox";
data mylib.data%sysfunc(monotonic());
…
run;
或编写宏以提供libref的名称。如果需要,宏还可以检查是否存在:
%macro nextName(lib=,base=data,check=1);
%local index name;
%if %length(&lib) %then %let lib=&lib..;/* handle non-empty lib */
%do %until (&check and not %sysfunc(exist(&name,data)));
%let name = &lib.&base.%sysfunc(monotonic());
%end;
&name
%mend;
data data3;run;
data data4;run;
%put %nextName();
%put %nextName();
%put %nextName();
%put %nextName();
proc sort data=sashelp.class out=%nextname();
by age;
run;
您可以进行强大的宏实现,并测试lib
的存在和有效的check
值。
答案 3 :(得分:1)
LIBNAME函数具有与FILENAME类似的功能,但是没有像FILENAME那样填充引用名称变量。我能想到的唯一方法是比较之前和之后的SASHELP.VLIBNAM。 libref的格式为WC00000n。
79 data _null_;
80 length libref $32.;
81 libref = ' ';
82 rc = libname(libref,'.');
83 msg = sysmsg();
84 put _all_;
85 run;
libref= rc=-70004 msg=NOTE: Libref refers to the same physical library as WC000004. _ERROR_=0 _N_=1