我刚刚开始学习SAS,因为我需要将它用于统计课程。对于本课程,大学通过其虚拟机设置提供SAS 9.2:我在他们的系统中进行预约,他们在其中一台服务器上生成VM,然后使用Microsoft的远程桌面客户端连接到VM。每个会话生成并擦除虚拟机;每次都会重置设置,并且文件必须存储在我的客户端计算机上(可以通过UNC路径在VM中访问)。
在此设置中,当我打开存储在笔记本电脑上的程序文件时,我只能通过硬编码完整路径或更新来访问附带的数据文件(每个文件都存储在与程序相同的文件夹中)每个会话开始时的“当前文件夹”设置。第一个是有问题的,因为这意味着该程序不会在其他地方运行 - 特别是当我通过电子邮件发送给教授时。第二个是不方便的,因为浏览到这个特定的UNC路径是耗时的,我已经必须浏览到相同的路径来打开程序文件。
我想通过以编程方式将当前文件夹设置为包含该程序的文件夹来使这更容易。然后我可以打开文件然后开始工作。我找到了getting the filename of the program file,getting the path to a fileref和(超出链接限制)设置当前文件夹的一些示例,但我无法以正确的方式将它们组合在一起。请为我连接点。
答案 0 :(得分:3)
要以编程方式从SAS更改Windows当前目录,您可以使用X
命令,这是使用“更改当前文件夹”对话框时实际发生的情况:
x 'cd "\\computername\share name\folder"';
您也可以使用SYSTEM
数据步骤函数执行此操作,这是我更喜欢的一种方法,因为您获得了返回代码(当然还有更多的输入法):
data _null_;
rc = system( 'cd "\\computername\share name\folder"' );
if rc = 0
then putlog 'Command successful';
else putlog 'Command failed';
run;
请注意,UNC路径用双引号括起来,如果路径包含空格,则必须使用双引号。
当然,这仍然需要您手动输入命令,但它可能是您可以添加到程序源代码中的内容。如果您的VM环境允许您在服务器上保留一些永久存在,则可以将此命令保存到启动文件中。
我会向你的教授征求意见;如果您正在处理作为课程一部分提供给您的数据,您可能只需要发送源代码。另一方面,如果您在作业中创建输出数据,您的教授可能希望您提供源代码和SAS数据集。当然,他或她会有一些程序。
答案 1 :(得分:1)
SAS的钝语符号需要一些奇怪的分隔符,以便将我的部分解决方案(找到路径)与@Bob Duell的部分解决方案(设置当前文件夹)结合起来。似乎涉及两个关键规则:
因此解决方案是计算引用路径的字符串(引号是字符串的一部分),并在双引号参数中将其扩展为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 intercepts而不是调用Windows命令行。我希望它会在包含引号的路径上失败。
答案 2 :(得分: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编辑器时可以正常工作。