Как в SAS вывести хотя бы одну строку на шаге данных, если в SET нет записей?

При чтении набора данных, который содержит нулевые записи, шаг данных не запускает никаких операторов put.

data test;
    set SASHELP.class end=eof;
    where 1=0;
    *output;
    if _N_=1 then put '[';
    put '"' name '",';
    if eof then put name ']';
    *output;
    run;

Можно ли заставить некоторых из них?

Причина, по которой я это делаю, заключается в том, что я создаю файлы json с операторами put
(я использую SAS9.3 и пока не имею доступа к proc json).

Файлы json полностью пусты, когда наборы данных пусты. Мне нужно, чтобы они содержали хотя бы пустой массив [].

Это означает, что мне понадобятся по крайней мере эти две строки для запуска:

if _N_=1 then put '[';
if eof then put name ']';

На данный момент я вынужден разделить это на 3 шага данных, один с головой (_N_=1), один с записями и последний с хвостом (eof=1). Может есть более короткое решение?


person stallingOne    schedule 30.08.2017    source источник
comment
Выполните проверку на наличие EOF и связанных с ним действий перед оператором SET.   -  person data _null_    schedule 30.08.2017


Ответы (1)


Здесь происходит следующее: когда SAS достигает set или input без записи для чтения, он завершает шаг данных в этой точке. Итак, поскольку set находится в верхней части вашего цикла, он немедленно завершается.

Если вы переместите два условия, которые вы хотите, наверх, это будет работать, например:

data test;
  if _n_=1 then put '[';
  if eof then put ']';
  set SASHELP.class end=eof;
  where 1=0;
  *output;
  put '"' name '",';
  *output;
run;

Тогда они будут работать независимо от того, есть там данные или нет.

Другой вариант, который мне нравится, — зацикливание чтения набора данных, но в этом случае, вероятно, это будет больше работы, чем пользы.

person Joe    schedule 30.08.2017