我正在尝试将一些SAS代码从Windows移植到Linux。在Windows上运行的原始代码具有设置,其中称为“驱动器”的符号引用被硬编码到特定目录,例如“C:\ SAS”,但是如果我想将文件结构移动到Linux,我需要这个符号引用相对于包含我正在运行的.sas文件的目录。是否可以查询SAS认为包含.sas文件的目录,或者相对于.sas文件包含目录设置此符号引用。
这是一个例子。有关信息./multi_use/datetime.sas和./info确实存在
Proc options option=work;
run;
* This first version works but is hard coded
*%let drive=%str(C:\SAS);
* This version does not work, attempting to set the symbolic reference, relatively.
* This is an attempt to set the symbolic reference "drive" such that is the actual
* directory that the controlling .sas file is located in
%let drive=%str(.);
*********************************************************;
%include "&drive/multi_use/datetime.sas";
libname info "&drive/info";
答案 0 :(得分:1)
如果您的访问权限已设置为发出操作系统级别的命令,那么您可能会遇到麻烦。 [我无权提交操作系统命令,因此无法提供帮助]
请参阅Functions and CALL Routines by Category中的SAS文件I / O部分,它将提供一些方便的功能,以实现您的目标。
对您的情况特别感兴趣的是:
FILENAME Function查看页面末尾的第3个示例,演示如何使用ls
。
[以下不需要操作系统命令:]
我还建议运行proc options ; run;
并检查日志以找出SAS作为其主目录的内容。您可以将SAS程序的路径设置为相对于该程序的路径。
见GETOPTION Function
答案 1 :(得分:0)
SAS没有内置方式可以告诉您当前正在执行的文件的路径/文件名。
如果您在启动SAS时位于主目录中并告诉它在不同的文件夹中运行文件(例如/tmp/myfile.sas),那么SAS使用的当前工作目录(CWD)将是您的主目录。例如:
cd ~
sas /tmp/myfile.sas
在上面的示例中,如果myfile.sas具有以下语句:
%include "blah.sas";
...它将在您的主目录(〜/ blah.sas)中查找blah.sas,而不是与您调用的文件(/tmp/blah.sas)位于同一文件夹中,因为CWD默认为wherever你是从。推出SAS的。
如果您想使其工作,可以通过在SAS会话中发出以下命令将SAS的CWD更改为/ tmp文件夹:
x cd /tmp; * SET CWD TO THE RELATIVE PATH;
请注意,如果您通过脚本调用SAS,则脚本可能会在启动SAS之前更改路径,但上述内容可能不适用。
请注意,我没有对上述内容进行测试,因为我目前无法在Linux环境中访问SAS。