Как открыть файл SAS из кода SAS с помощью пакетной обработки? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть макропрограмма SAS для проверки открытия файла и вывода общего количества наблюдений в журнал.Когда я запускаю его через SAS, я могу вывести количество наблюдений в журнале SAS (как и предполагалось).Однако, когда я запускаю программу SAS через пакетный скрипт, файл не обнаруживается / не может быть открыт.Что я делаю неправильно?

См. Код для программы 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\9.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\9.4\"

set pInPath03=C:\Users\%pUserNam%\Documents\log
set pInPath05="C:\Program Files\SASHome\SASFoundation\9.4\sas.exe"
set pInPath06="C:\Program Files\SASHome\x86\SASFoundation\9.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 (см., как я прокомментировал вторую группу %let из usernam, evSuffix, evSeq и 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).

1 Ответ

0 голосов
/ 05 февраля 2019

Включите MPRINT, чтобы вы могли видеть полный текст оператора LIBNAME.Это поможет вам устранить ошибку.

Open for data set mor2014.ije_mortality_201402_err failed - ERROR: Libref MOR2014 is not assigned.
...