SAS:如何在目录中存储宏
SAS: How do I Store a Macro in a Catalog
这是 previous post 的后续问题。除了在我的原始 post:
中引用的资源之外,我正在尝试将宏存储在这些文章概述的目录中
- PROC CATALOG, the Wish Book SAS® Procedure
- Ways to Store Macro Source Codes and How to Retrieve Them
- Creating a Stored Macro Facility in Ten Minutes
这是我到目前为止所做的:
我创建了一个目录 "C:\myMacros." 首先,我创建了一个名为 "HelloWorld.sas" 的程序,其中包含以下代码:
/* HelloWorld.sas */
option mstored sasmstore=mymacros;
libname myMacros 'C:\myMacros';
%macro HelloWorld() / store source;
data _null_;
put "Hello, World!";
run;
%mend;
代码使用以下日志条目执行:
1 option mstored sasmstore=mymacros;
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3
4 %macro HelloWorld() / store source;
5 data _null_;
6 put "Hello, World!";
7 run;
8 %mend;
在 SAS 文件资源管理器中,已创建活动库 "Mymacros",其中驻留名为 "Sasmacr" 的目录。在 Windows Explorer 中检查,我看到 "C:\myMacros\sasmacr.sas7bcat" 已经创建。在 SAS 文件资源管理器中,我单击 "Sasmacr" 目录并在其中找到 "Helloworld"。当我双击它时,我收到消息框说,
No default action for the Macro data type.
因此,我断定宏已经被编译并存储在"Sasmacr"目录中。我关闭 SAS 以清除所有内存。
现在,我尝试调用宏。我打开一个新的 SAS 会话并创建一个名为 "CallHelloWorld1.sas" 的新程序,其中包含以下代码:
/* CallHelloWorld1.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr.helloworld.source';
%include myCat;
%HelloWorld();
这会在 %include
语句处产生错误。
1 /* CallHelloWorld1.sas */
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3 filename myCat catalog 'mymacros.sasmacr.helloworld.source';
4 %include myCat;
ERROR: Physical file does not exist, SOURCE .
ERROR: Cannot open %INCLUDE file MYCAT.
5
6 %HelloWorld();
-
180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order.
错误提示物理文件不存在,这与我上面的观察相矛盾。所以,我得出结论,我叫错了。根据 FILENAME Statement, CATALOG Access Method,SAS 四部分名称由 library.catalog.entry.entrytype 组成。我的陈述包括
- 库:
myMacros
由 libname myMacros 'C:\myMacros';
定义
- 目录:
sasmacr
- 条目:
helloworld
- 类型:
source
即mymacros.sasmacr.helloworld.source
。这里一定有错误,但我无法理解它是什么。
为了尝试另一种方法,我再次关闭 SAS 以清除内存。我创建 "CallHelloWorld2.sas" 其中包含以下代码:
/* CallHelloWorld2.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr';
%include myCat(HelloWorld);
%HelloWorld();
这也会在 %include
行产生错误:
1 /* CallHelloWorld2.sas */
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3 filename myCat catalog 'mymacros.sasmacr';
4 %include myCat(HelloWorld);
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
5
6 %HelloWorld();
-
180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order.
看来我的宏没有正确存储或者调用不正确。然而,资源严重不足。请帮忙!
libname myMacros 'C:\temp';
option mstored sasmstore=mymacros;
%helloWorld()
这就是您需要做的全部 - 提醒 SAS 您指向的地方,然后 运行 宏。您不需要 %include 任何内容。
这是 previous post 的后续问题。除了在我的原始 post:
中引用的资源之外,我正在尝试将宏存储在这些文章概述的目录中- PROC CATALOG, the Wish Book SAS® Procedure
- Ways to Store Macro Source Codes and How to Retrieve Them
- Creating a Stored Macro Facility in Ten Minutes
这是我到目前为止所做的:
我创建了一个目录 "C:\myMacros." 首先,我创建了一个名为 "HelloWorld.sas" 的程序,其中包含以下代码:
/* HelloWorld.sas */
option mstored sasmstore=mymacros;
libname myMacros 'C:\myMacros';
%macro HelloWorld() / store source;
data _null_;
put "Hello, World!";
run;
%mend;
代码使用以下日志条目执行:
1 option mstored sasmstore=mymacros;
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3
4 %macro HelloWorld() / store source;
5 data _null_;
6 put "Hello, World!";
7 run;
8 %mend;
在 SAS 文件资源管理器中,已创建活动库 "Mymacros",其中驻留名为 "Sasmacr" 的目录。在 Windows Explorer 中检查,我看到 "C:\myMacros\sasmacr.sas7bcat" 已经创建。在 SAS 文件资源管理器中,我单击 "Sasmacr" 目录并在其中找到 "Helloworld"。当我双击它时,我收到消息框说,
No default action for the Macro data type.
因此,我断定宏已经被编译并存储在"Sasmacr"目录中。我关闭 SAS 以清除所有内存。
现在,我尝试调用宏。我打开一个新的 SAS 会话并创建一个名为 "CallHelloWorld1.sas" 的新程序,其中包含以下代码:
/* CallHelloWorld1.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr.helloworld.source';
%include myCat;
%HelloWorld();
这会在 %include
语句处产生错误。
1 /* CallHelloWorld1.sas */
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3 filename myCat catalog 'mymacros.sasmacr.helloworld.source';
4 %include myCat;
ERROR: Physical file does not exist, SOURCE .
ERROR: Cannot open %INCLUDE file MYCAT.
5
6 %HelloWorld();
-
180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order.
错误提示物理文件不存在,这与我上面的观察相矛盾。所以,我得出结论,我叫错了。根据 FILENAME Statement, CATALOG Access Method,SAS 四部分名称由 library.catalog.entry.entrytype 组成。我的陈述包括
- 库:
myMacros
由libname myMacros 'C:\myMacros';
定义
- 目录:
sasmacr
- 条目:
helloworld
- 类型:
source
即mymacros.sasmacr.helloworld.source
。这里一定有错误,但我无法理解它是什么。
为了尝试另一种方法,我再次关闭 SAS 以清除内存。我创建 "CallHelloWorld2.sas" 其中包含以下代码:
/* CallHelloWorld2.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr';
%include myCat(HelloWorld);
%HelloWorld();
这也会在 %include
行产生错误:
1 /* CallHelloWorld2.sas */
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3 filename myCat catalog 'mymacros.sasmacr';
4 %include myCat(HelloWorld);
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
5
6 %HelloWorld();
-
180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order.
看来我的宏没有正确存储或者调用不正确。然而,资源严重不足。请帮忙!
libname myMacros 'C:\temp';
option mstored sasmstore=mymacros;
%helloWorld()
这就是您需要做的全部 - 提醒 SAS 您指向的地方,然后 运行 宏。您不需要 %include 任何内容。