如何通过批处理从 SAS 代码打开 SAS 文件?
How to open a SAS file from SAS code through Batch processing?
我有一个 SAS 宏程序来测试打开文件并输出日志中的观察总数。当我通过 SAS 运行 它时,我能够在 SAS 日志中输出观察的数量(如预期的那样)。但是,当我通过批处理脚本运行 SAS 程序时,文件不是detected/can 打不开。我做错了什么?
查看 SAS 程序的代码:
%macro syserrClass;
options symbolgen;
/* Define macro variables */
%let usernam = %sysget(pUserNam);
%let evSuffix = %sysget(pSuffix); /* Suffix of program name: eg. year 2018 */
%let evSeq = %sysget(pSeq);
%let evLib01 = %sysget(pLib01); /* SAS lib name for SAS data set */
*%let usernam = myusername;
*%let evSuffix = 2014;
*%let evSeq = 02;
*%let evLib01 = mor2014; /* SAS lib name for SAS data set */
%let filen03 = ije_mortality_&evSuffix.&evSeq._err; /* Input file */
LIBNAME &evLib01. v9 "C:\Users\&usernam.\Documents\My SAS Files.4\&evLib01.";
/* Open data set */
%let dsId1 = %sysfunc(open(&evLib01..&filen03.));
/* If the data set exists, get the number of observations */
%if &dsId1. %then %do;
%let nobs1 = %sysfunc(attrn(&dsId1.,nobs));
%let rc = %sysfunc(close(&dsId1.));
%put &evLib01..&filen03. has &nobs1. observation(s).;
%end;
%else
%put Open for data set &evLib01..&filen03. failed - %sysfunc(sysmsg());
%mend;
/* Call macro */
%syserrClass;
查看批处理脚本 (.cmd) 的代码:
@echo off
setlocal
set "pUserNam=%username%"
set "pSuffix=%1"
set "pSeq=%2"
set "pLib01=%3"
set inPath01="C:\Users\%pUserNam%\Documents"
set inPath02="My SAS Files.4\"
set pInPath03=C:\Users\%pUserNam%\Documents\log
set pInPath05="C:\Program Files\SASHome\SASFoundation.4\sas.exe"
set pInPath06="C:\Program Files\SASHome\x86\SASFoundation.4\sas.exe"
rem set SAS exe path depending on existence of path
if exist %pInPath05% (set programname=%pInPath05%) else (set programname=%pInPath06%)
rem folder with output files - sas
set pLib02=mor%pSuffix%
rem Print summary of exceptions grouped by file name
set sasprogram="C:\Users\%username%\Documents\sascode\test_exceptrpt_macro01.sas"
%programname% -sysin %sasprogram% -log %pInPath03%\ije_mortality_exceptrpt01_%pSuffix%%pSeq%.txt -set pUserNam %pUserNam% -set pSuffix %pSuffix% -set pSeq %pSeq% -set pLib01 %pLib02%
echo SAS Program: %sasprogram%
if %ERRORLEVEL% GTR 1 (
echo ERROR: Return code = %ERRORLEVEL%
goto endproc
) else (echo NOTE: Return code = %ERRORLEVEL%)
:endproc
当我 运行 通过批处理时,在日志中突出的主要输出是:
SYMBOLGEN: Macro variable DSID1 resolves to 0
SYMBOLGEN: Macro variable EVLIB01 resolves to mor2014
SYMBOLGEN: Macro variable FILEN03 resolves to ije_mortality_201402_err
Open for data set mor2014.ije_mortality_201402_err failed - ERROR: Libref MOR2014 is not assigned.
但是,当我切换 SAS 代码以使用 SAS 交互式变量时(请参阅我如何评论 usernam
、evSuffix
、[=16 的第二组 %let
=], 和 evLib01
), 我在日志中得到这个:
SYMBOLGEN: Macro variable DSID1 resolves to 2
SYMBOLGEN: Macro variable EVLIB01 resolves to mor2014
SYMBOLGEN: Macro variable FILEN03 resolves to ije_mortality_201402_err
SYMBOLGEN: Macro variable NOBS1 resolves to 5
mor2014.ije_mortality_201402_err has 5 observation(s).
打开 MPRINT,这样您就可以看到 LIBNAME 语句的全文。这将帮助您解决错误。
Open for data set mor2014.ije_mortality_201402_err failed - ERROR: Libref MOR2014 is not assigned.
我有一个 SAS 宏程序来测试打开文件并输出日志中的观察总数。当我通过 SAS 运行 它时,我能够在 SAS 日志中输出观察的数量(如预期的那样)。但是,当我通过批处理脚本运行 SAS 程序时,文件不是detected/can 打不开。我做错了什么?
查看 SAS 程序的代码:
%macro syserrClass;
options symbolgen;
/* Define macro variables */
%let usernam = %sysget(pUserNam);
%let evSuffix = %sysget(pSuffix); /* Suffix of program name: eg. year 2018 */
%let evSeq = %sysget(pSeq);
%let evLib01 = %sysget(pLib01); /* SAS lib name for SAS data set */
*%let usernam = myusername;
*%let evSuffix = 2014;
*%let evSeq = 02;
*%let evLib01 = mor2014; /* SAS lib name for SAS data set */
%let filen03 = ije_mortality_&evSuffix.&evSeq._err; /* Input file */
LIBNAME &evLib01. v9 "C:\Users\&usernam.\Documents\My SAS Files.4\&evLib01.";
/* Open data set */
%let dsId1 = %sysfunc(open(&evLib01..&filen03.));
/* If the data set exists, get the number of observations */
%if &dsId1. %then %do;
%let nobs1 = %sysfunc(attrn(&dsId1.,nobs));
%let rc = %sysfunc(close(&dsId1.));
%put &evLib01..&filen03. has &nobs1. observation(s).;
%end;
%else
%put Open for data set &evLib01..&filen03. failed - %sysfunc(sysmsg());
%mend;
/* Call macro */
%syserrClass;
查看批处理脚本 (.cmd) 的代码:
@echo off
setlocal
set "pUserNam=%username%"
set "pSuffix=%1"
set "pSeq=%2"
set "pLib01=%3"
set inPath01="C:\Users\%pUserNam%\Documents"
set inPath02="My SAS Files.4\"
set pInPath03=C:\Users\%pUserNam%\Documents\log
set pInPath05="C:\Program Files\SASHome\SASFoundation.4\sas.exe"
set pInPath06="C:\Program Files\SASHome\x86\SASFoundation.4\sas.exe"
rem set SAS exe path depending on existence of path
if exist %pInPath05% (set programname=%pInPath05%) else (set programname=%pInPath06%)
rem folder with output files - sas
set pLib02=mor%pSuffix%
rem Print summary of exceptions grouped by file name
set sasprogram="C:\Users\%username%\Documents\sascode\test_exceptrpt_macro01.sas"
%programname% -sysin %sasprogram% -log %pInPath03%\ije_mortality_exceptrpt01_%pSuffix%%pSeq%.txt -set pUserNam %pUserNam% -set pSuffix %pSuffix% -set pSeq %pSeq% -set pLib01 %pLib02%
echo SAS Program: %sasprogram%
if %ERRORLEVEL% GTR 1 (
echo ERROR: Return code = %ERRORLEVEL%
goto endproc
) else (echo NOTE: Return code = %ERRORLEVEL%)
:endproc
当我 运行 通过批处理时,在日志中突出的主要输出是:
SYMBOLGEN: Macro variable DSID1 resolves to 0
SYMBOLGEN: Macro variable EVLIB01 resolves to mor2014
SYMBOLGEN: Macro variable FILEN03 resolves to ije_mortality_201402_err
Open for data set mor2014.ije_mortality_201402_err failed - ERROR: Libref MOR2014 is not assigned.
但是,当我切换 SAS 代码以使用 SAS 交互式变量时(请参阅我如何评论 usernam
、evSuffix
、[=16 的第二组 %let
=], 和 evLib01
), 我在日志中得到这个:
SYMBOLGEN: Macro variable DSID1 resolves to 2
SYMBOLGEN: Macro variable EVLIB01 resolves to mor2014
SYMBOLGEN: Macro variable FILEN03 resolves to ije_mortality_201402_err
SYMBOLGEN: Macro variable NOBS1 resolves to 5
mor2014.ije_mortality_201402_err has 5 observation(s).
打开 MPRINT,这样您就可以看到 LIBNAME 语句的全文。这将帮助您解决错误。
Open for data set mor2014.ije_mortality_201402_err failed - ERROR: Libref MOR2014 is not assigned.