Как записать текущий шаг в SAS? - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь следить за ходом длинного сценария SAS. В начале я использовал что-то вроде:

DATA work.dataset1;
    SYSECHO "Currently working on: work.dataset1";
    /* DO STUFF*/
END;

PROC SORT DATA=work.dataset1 OUT = work.work.dataset2;
    SYSECHO "Currently working on: work.dataset2";
    /* DO STUFF*/
END;
  .....
DATA work.datasetn;
    SYSECHO "Currently working on: work.datasetn";
    /* DO STUFF*/
END;

Однако это очень сложно поддерживать и очень многословно. Поэтому я попытался создать макрос, который бы автоматически получал имя шага или набор данных шага (или любую информацию, сообщающую мне, какой шаг выполняется в данный момент) и передавал его SYSECHO:

%macro nstep;
SYSECHO "Finished Processing &SYSLAST";
%mend;


DATA work.dataset1;
    %nstep;
    /* DO STUFF*/
END;

Однако , это фактически печатает последний измененный набор данных, а не текущий. Следовательно, поведение особенно проблематично c при выполнении первого шага, при первом использовании %nstep отображается имя набора данных из предыдущего выполнения.

Я ищу способ найти текущие данные / pro c имя оператора или любая различимая информация, читаемая человеком.

1 Ответ

3 голосов
/ 29 января 2020

В SAS нет явного механизма самоанализа или обратного вызова для обработки исходного кода на уровне супервизора, времени сбора инструкции шага (предварительной компиляции) или во время пошаговой компиляции.

Однако вы можете реализовать и использовать (принять ) структура, определяющая имя, которая выполняет требуемые действия.

Концепция:

  • Создайте макрос, E, который принимает имя будет сообщено.
  • Сообщение о имя с использованием SYSECHO через DOSUBL
  • Emit имя as исходный код
  • Используйте %E(<name>) (в контексте фактического исходного кода) всякий раз, когда вы хотите отправить сообщение с именем обратно клиенту IOM

Framework в коде:

%* part of autoexec, autocall, or specified macro library;
%macro E(name);
  &name
  %local rc;
  %let rc = %sysfunc(DOSUBL(%nrstr(
    %put NOTE: SYSECHOing &name;  /* The put NOTE: can be removed if you want */
    SYSECHO "Working on &name";
  )));
%mend;


DATA %E(work.dataset1);
    /* DO STUFF*/
RUN;

PROC SORT DATA=work.dataset1 OUT = %E(work.dataset2);
    /* DO STUFF*/
RUN;
… 
DATA %E(work.dataset27);
    /* DO STUFF*/
END;

Не автомат c, но не многословно.

...