派生SAS中唯一的libref和/或fileref

时间:2019-08-06 12:14:38

标签: sas sas-macro

我经常需要分配(和取消分配)临时的librefs / filerefs作为实用程序宏的一部分-因此,我需要避免与任何现有的librefs / filerefs命名冲突。我知道我可以查询sashelp或字典表,并使用条件逻辑进行迭代,直到找到未分配的表,但是我想知道是否有更简单的方法?

例如,以下代码将在工作库中创建一个唯一命名的数据集:

data;run;

librefs / filerefs是否有等效项?

4 个答案:

答案 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;

返回;

enter image description here

更新:

我已将这两个宏添加到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