5

我刚刚开始学习 SAS,因为我需要将它用于统计课程。对于本课程,该大学通过他们的虚拟机设置提供 SAS 9.2:我在他们的系统中进行预订,他们在其中一台服务器上生成一个 VM,然后我使用 Microsoft 的远程桌面客户端连接到该 VM。每个会话生成和擦除虚拟机;每次都会重置设置,并且文件必须存储在我的客户端计算机上(可以通过 UNC 路径在 VM 中访问)。

在此设置中,当我打开存储在笔记本电脑上的程序文件时,我只能通过硬编码完整路径或更新“当前文件夹”在每个会话开始时设置。第一个是有问题的,因为这意味着该程序不会在其他任何地方运行 - 特别是当我通过电子邮件将其发送给教授时。第二个是不方便的,因为浏览到这个特定的 UNC 路径非常耗时,而且我已经必须浏览到相同的路径才能打开程序文件。

我想通过以编程方式将当前文件夹设置为包含该程序的文件夹来简化此操作。然后我可以打开文件并开始工作。我找到了一些获取程序文件的文件名获取 fileref 的路径以及(超出链接限制)设置当前文件夹的示例,但我无法以正确的方式组合它们。请为我连接点。

4

3 回答 3

3

要以编程方式从 SAS 更改 Windows 当前目录,您可以使用该X命令,这是使用“更改当前文件夹”对话框时真正发生的情况:

x 'cd "\\computername\share name\folder"';

您也可以使用SYSTEMdata step 函数来执行此操作,这是我更喜欢的一种方法,因为您会得到一个返回码(但当然要输入更多):

data _null_;
   rc = system( 'cd "\\computername\share name\folder"' );
   if rc = 0 
      then putlog 'Command successful';
      else putlog 'Command failed';
run;

请注意,UNC 路径用双引号括起来,如果路径包含空格,这是必需的。

当然,这仍然需要您手动输入命令,但它可能是您可以添加到程序源代码中的内容。如果您的 VM 环境允许您在服务器上保持某些永久存在,则可以将此命令保存到启动文件中。

我想请教你的教授;如果您正在使用作为课程的一部分提供给您的数据,您可能只需要发送源代码。另一方面,如果您将创建输出数据作为作业的一部分,您的教授可能希望您提供源代码和 SAS 数据集。他或她肯定会有一些程序。

于 2013-01-19T15:02:47.687 回答
1

完整答案:

SAS 的钝符号需要一些奇怪的分隔符摆弄才能将我的部分解决方案(查找路径)与@Bob Duell 的部分解决方案(设置当前文件夹)结合起来。似乎涉及两个关键规则:

  • &var 在双引号字符串 ("&var") 中展开,但不是在单引号字符串 ('&var') 中展开
  • &var 中的引号在展开后不被视为分隔符

因此解决方案是计算带引号的路径的字符串(其中引号是字符串的一部分),并在双引号参数中将其扩展为 X 或 SYSTEM:

%let qsrc=%str(%")&src%str(%");
X "cd &qsrc"

不需要存储字符串,&src 和 &qsrc 都可以就地扩展,从而产生单个语句解决方案:

X "cd %str(%")%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))%str(%")";

这可以正确执行,但会破坏 GUI 中的语法着色。在一个字符串中,%str(%")并且""都扩展为",因此用两者替换%str(%")可以""正确执行并且在 GUI 中正确着色:

X "cd ""%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))""";

这继承了它仅在定义 SAS_EXECFILEPATH 和 SAS_EXECFILENAME 时才有效的限制,从 Windows GUI 编辑器中运行时就是这种情况。它还受到“cd”命令中的任何限制,SAS 拦截而不是调用 Windows 命令行。我希望它会在包含引号的路径上失败。

于 2013-01-19T18:54:55.633 回答
0

部分答案:从程序文件的文件名中获取包含文件夹的一种方法

展开和记录步骤:

/* Find PathName of folder containing program */
%let FullName=%sysget(SAS_EXECFILEPATH);
%put FullName: &FullName.;
%let FullLen=%length(&FullName);
%put FullLen: &FullLen.;
%let BaseName=%sysget(SAS_EXECFILENAME);
%put BaseName: &BaseName.;
%let BaseLen=%length(&BaseName);
%put BaseLen: &BaseLen.;
%let PathLen=%eval(&FullLen.-&BaseLen.);
%put PathLen: &PathLen.;
%let PathName=%substr(&FullName,1,&PathLen);
%put PathName: &PathName.;

合并和沉默:

/* Find src folder */
%let src=%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))));

这仅在定义 SAS_EXECFILEPATH 和 SAS_EXECFILENAME 时有效,并且不清楚何时定义。它在使用 Windows GUI 编辑器时确实有效。

于 2013-01-19T17:29:30.183 回答