Macros SAS:重命名宏目录

Macros SAS:重命名宏目录,macros,sas,catalog,Macros,Sas,Catalog,我想在目录中存储宏。这样做可以让多个宏只与一个文件共享,并且引入了与用户的某种程度的分离 为了存储宏,我运行一个程序,如 /* HelloWorld.sas */ libname pwd "."; /* assign current directory */ option mstored sasmstore=pwd; /* set pwd as storage directory */ %macro HelloWorld() / store source;

我想在目录中存储宏。这样做可以让多个宏只与一个文件共享,并且引入了与用户的某种程度的分离

为了存储宏,我运行一个程序,如

/* HelloWorld.sas */
libname pwd ".";              /* assign current directory */
option mstored sasmstore=pwd; /* set pwd as storage directory */ 

%macro HelloWorld() 
    / store source;           /* store compiled macro along with its source */
  data _null_;
    put "Hello, World!";
  run;
%mend;
这将在
HelloWorld.sas
所在的目录中创建一个
sasmacr.sas7bcat
文件。然后,我可以将该文件移动到另一个目录,例如
C:\myMacros
,并运行以下程序:

/* CallHelloWorld.sas */
libname myMacros 'C:\myMacros';
option mstored sasmstore=myMacros;

%HelloWorld();
调用宏
HelloWorld()
时不会出错

但是,如果我想把“代码> HelorOrdLo())/Cuff>宏作为“HeloWord”宏套件的一部分,我不能简单地将Windows Explorer中的目录名从<代码> SASMACR。SAS7BCAT/<代码>改为<代码> HeloLogL.SAS7BCAT。当我执行此操作并再次尝试运行

CallHelloWorld.sas
时(在关闭并重新打开sas后),宏不会被解析

1    /* CallHelloWorld.sas */
2    libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\myMacros
3    option mstored sasmstore=myMacros;
4
5    %HelloWorld();
     -
     180
NOTE: The SAS System was unable to open the macro library referenced by the SASMSTORE = libref
      MYMACROS.
WARNING: Apparent invocation of macro HELLOWORLD not resolved.

ERROR 180-322: Statement is not valid or it is used out of proper order.

ERROR: Catalog MYMACROS.SASMACR does not exist.
NOTE: The SAS System was unable to open the macro library referenced by the SASMSTORE = libref
      MYMACROS.
ERROR: An error occurred during the execution of the %COPY statement.

如何更改包含宏的目录的名称,以便在各种程序中调用这些宏?是否可以预先将目录命名为与sasmacr不同的名称?

我认为您不能从sasmacr重命名目录,而仍然直接使用它。但是,您可以使用
PROC CATALOG
来管理
SASMACR
目录

您要做的是,当您想要包含特定宏时,通过
proc catalog
将其从源位置复制到您选择的
SASMSTORE
位置

比如:

libname myMacros 'C:\temp';
libname pwd '.';

options mstored sasmstore=pwd;

proc catalog catalog=myMacros.HelloWorld;
  copy out=pwd.sasmacr;
run;
quit;


%HelloWorld();
现在-我认为这可能是过分的;真的没有理由用这种方式创建单独的宏目录。如果你喜欢单独包含文件的想法,你可能想考虑AutoCal宏(在那里你不存储它们编译,但存储他们的来源,并按需编译);实际上,在SAS中编译宏几乎不需要任何成本。但是,如果您喜欢使用存储的编译宏,那么这种方法可能是最好的方法


当然,我认为更简单的方法是离开catalog
SASMACR.SAS7BCAT
并使用目录名确定它是什么,然后将librefs附加到
sasmstore
选项值

至少在使用SAS 9.4的Unix上,您可以使用SASAAUTOS选项指向使用ZIP引擎的FILEREF,以便将所有宏定义存储在单个ZIP文件中

其中一个“技巧”是您需要更改ZIP文件中成员文件的名称。通常在unix SAAUTOS上,要求使用带有扩展名(
helloworld.sas
)的小写宏名称命名源文件。但是,对于要使用ZIP文件的sasauts,应该使用不带扩展名的大写宏名称命名成员(
HELLOWORLD

编辑


不幸的是,此方法会导致SAS生成错误消息:在ZIP文件中找不到宏源文件时,即使最终在SASAAUTOS选项搜索路径中的另一个文件中找到宏源文件。

来自DATA\u NULL\u我已收到如何使用不同名称的现有目录的答案。使用CATNAME语句。因此,如果有catalogs TEST.CAT1和TEST.CAT2,可以使用CATNAME语句使TEST.SASMACR成为两个宏的串联

CATNAME test.sasmacr
  (test.cat1 (ACCESS=READONLY)
   test.cat2 (ACCESS=READONLY)
  )
;
现在可以将SASMSTORE选项指向testlibref

option mstored sasmstore=test;
下面是一个示例,说明如何使用
PROC CATALOG
将编译到
SASMACR
目录中的成员复制到具有不同名称的目录中,从而创建此类单独的目录

libname templib '~/test/cat1';
libname permlib '~/test';
options mstored sasmstore=templib;

%macro HelloWorld1() / store source;
  data _null_;
    put "Hello, World! &sysmacroname";
  run;
%mend;

%macro HelloWorld2() / store source;
  data _null_;
    put "Hello, World! &sysmacroname";
  run;
%mend;

proc catalog cat=templib.sasmacr ;
   copy out=permlib.cat1;
      select helloworld1 /et=macro;
   run;
   copy out=permlib.cat2;
      select helloworld2 /et=macro;
   run;
quit;
现在使用
CATNAME
命令将目录链接在一起

options mstored sasmstore=permlib;
CATNAME permlib.sasmacr
  (permlib.cat1 (ACCESS=READONLY)
   permlib.cat2 (ACCESS=READONLY)
);

%helloworld1;
%helloworld2;

我强烈主张有充分的理由希望宏位于唯一命名的目录中。关键是能够与其他人共享特定于项目的宏。目录似乎是SAS识别的唯一容器。如果没有目录,宏必须在加载之前的某个时间点作为单个文件存在。这会带来损失、修改等风险。这会限制控制。此外,当使用同一个人处理多个项目时,单个目录名会成为一个问题。一个人可能有几个
sasmacr
文件,每个文件对应一个不同的项目。解决方案是单独的目录名称。从SAS:Certification Prep Guide,4ed,第12章“使用存储的编译宏”一节中,“Sasmacr是唯一可以存储编译宏的目录。您可以在任何SAS库中创建名为Sasmacr的目录。您不应重命名此目录或其条目。”是否可以将
sasmacr
本身存储在具有唯一名称的目录中?解决方案是使用多个不同的文件夹,至少就我所知,SAS会让您这样做。然后将libname添加到每个文件夹。这就是你第二条评论的答案:将每个文件夹放在一个唯一的文件夹中,然后将libname放在每个文件夹中,这实际上就是你所描述的所有意图和目的。可以发布文件名mymacros zip'C:\mymacros\HelloWorld.zip'fileext lowcase\u memname
选项SASUNS=(mymacros SASUNS)
但是,您无法多次运行
文件名
语句,如下所示:我根据更改了
选项
语句,并且文件名ZIP在此处提供了选项:这非常漂亮!共享宏库的好方法,或者存储备用宏库并指向它们。如果您可以使用写密码锁定.zip文件,这将是避免意外更改的简单方法。这似乎是一个很好的方法,可以实现将宏存储在单个文件中的目标。感谢您提供有关zip引擎选项的提示。sasauts中使用的锁定fileref的“bug”已经存在很长时间了。当使用目录存储自动调用宏时,我总是使用物理路径,而不是SASAuts中的fileref,因为这是为了利用
options mstored sasmstore=permlib;
CATNAME permlib.sasmacr
  (permlib.cat1 (ACCESS=READONLY)
   permlib.cat2 (ACCESS=READONLY)
);

%helloworld1;
%helloworld2;