全部放在一个SAS文件里,看起来会很麻烦
并且SAS自带的编辑器极端难用,也不会自动折叠什么的
于是想到了把一个长代码拆成若干小代码,然后用%include调用,如下所示:
- %include "d:\temp\a.sas";
这时出现的问题就是SAS能否实现相对路径引用,这样你的代码不论移到哪个文件夹,都可以直接调用,不用再修改路径名称了。
于是我在网上查了下,发现直接实现应该无望,于是用了下面折衷的办法,用一个宏得到当前的活动文件夹路径宏变量,然后就可以在%include中使用了
- %macro GetCurrentPath(Type,OutputVar);
- /**********************************************************************/
- /* 此宏用于得到当前活动路径或文件名。其中,Type是标记变量,=Path表示 */
- /* 不包括文件名的路径,以\结尾,=FullPath表示全部路径,=FileNameAndExt*/
- /* 表示包含扩展名的全部文件名,=FileName表示文件名;OutputVar是输出的 */
- /* 宏变量名称。此宏主要用于变相得到相对路径引用。 */
- /* */
- /* 最终得到的是当前活动路径或文件名的宏变量&OutputVar。 */
- /* */
- /**********************************************************************/
- /* 检查Type的合法性 */
- %if (%UPCASE(&Type) NE PATH) AND (%UPCASE(&Type) NE FULLPATH) AND (%UPCASE(&Type) NE FILENAMEANDEXT) AND (%UPCASE(&Type) NE FILENAME) %then %do;
- %put ERROR: The Type should be Path, FullPath, FileNameAndExt or FileName, case insensitive and without quotes.;
- %goto exit;
- %end;
- /* 检查OutputVar的存在性 */
- %if &OutputVar EQ %STR() %then %do;
- %put ERROR: The OutputVar should not be blank, please check it again.;
- %goto exit;
- %end;
- %global &OutputVar;
- /* 开始进行计算 */
- %if %UPCASE(&Type) EQ PATH %then %do;
- %let &OutputVar=%QSUBSTR(%SYSGET(SAS_EXECFILEPATH),1,%LENGTH(%SYSGET(SAS_EXECFILEPATH))-%LENGTH(%SYSGET(SAS_EXECFILENAME)));
- %end;
- %else %if %UPCASE(&Type) EQ FULLPATH %then %do;
- %let &OutputVar=%SYSGET(SAS_EXECFILEPATH);
- %end;
- %else %if %UPCASE(&Type) EQ FILENAMEANDEXT %then %do;
- %let &OutputVar=%SYSGET(SAS_EXECFILENAME);
- %end;
- %else %if %UPCASE(&Type) EQ FILENAME %then %do;
- %let &OutputVar=%QSUBSTR(%SYSGET(SAS_EXECFILENAME),1,%LENGTH(%SYSGET(SAS_EXECFILENAME))-%LENGTH(%SCAN(%SYSGET(SAS_EXECFILENAME),-1,%STR(.)))-1);
- %end;
- %exit:
- %mend;



雷达卡





京公网安备 11010802022788号







