SAS Печать в пользовательский отчет - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать пользовательский текстовый отчет из моего кода sas, ниже приведен код

data have ;
  ncandidates=1; ngames=3; controlppt=1; controlgame=2;
  ppt1='Abc'; ppt2='Bcd';
  infile cards dsd dlm='|';
  input (var1-var21) ($);
cards;
1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b
1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b
;
filename report 'myreport.txt';
data _null_;
  file report dsd dlm='|' LRECL=8614;
  a='';
  put
    83*'#'
  / '##### Number of ppts'
  / 83*'#'
  / 'input.Name=' @
  ;
  eof = 0;
  do until(eof);
  set have end=eof;
  If not missing(var1) then
  put var1-var10 @@ ;
  end;

  put a
 // 83*'#'
  / '##### Output Data'
  / 83* '#'
 // 'output.Name=' @;

  eof=0;
  do until(eof);
  set have ;
  If not missing(var11) then
  put var11-var20 @@  ;
  end;
  put '1';

run;

В файл выводится все, кроме последнего положенного '1';Ничего после второй не делать, пока блок не будет выполнен;Кроме того, если я добавлю end=eof к последнему блоку до, то все будет напечатано дважды.

Есть ли у нас решение по этому поводу?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

«Простой» шаг DATA останавливается при попытке чтения после прочтения последней записи набора.Обычно это происходит во время неявного цикла, который присущ магии шага DATA.Когда вы зацикливаете набор явным образом с проверками конца данных, попытка чтения после него не происходит и, таким образом, не означает, что шаг окончательно не завершается.

Флаг eof изменяется только при достижении конца данных.Он не установлен в 0, когда не в конце данных - флаг eof это просто то, что он есть в начале цикла.Таким образом, флаг должен быть сброшен при повторном использовании для последующего цикла.

* 'top' is logged twice;
* the data step ends when the second implicit iteration tries to read past eof of the first set;

data _null_;
  put 'top';

  do until (eof);
    set sashelp.class(obs=2) end=eof;
    put name=;
  end;

  eof = 0; * reset flag;
  do until (eof);
    set sashelp.class(where=(name=:'J')) end=eof;
    put name=;
  end;
run;


* 'top' is logged once;
* the data step ends when the stop is reached at the bottom;

data _null_;
  put 'top';

  do until (eof);
    set sashelp.class(obs=2) end=eof;
    put name=;
  end;

  eof = 0;
  do until (eof);
    set sashelp.class(where=(name=:'J')) end=eof;
    put name=;
  end;
run;
0 голосов
/ 10 декабря 2018

Я не уверен в причине проблемы.Но иногда SAS ведет себя странно, если набор данных читается несколько раз, как вы это делаете.Но использование другой переменной для секунды set have end=eof2; решает проблему:

data have ;
  ncandidates=1; ngames=3; controlppt=1; controlgame=2;
  ppt1='Abc'; ppt2='Bcd';
  infile cards dsd dlm='|';
  input (var1-var21) ($);
cards;
1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b
1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b
;
filename report '~/myreport.txt';
data _null_;
  file report dsd dlm='|' LRECL=8614;
  a='';
  put
    83*'#'
  / '##### Number of ppts'
  / 83*'#'
  / 'input.Name=' @
  ;
  eof = 0;
  do until(eof);
  set have end=eof;
  If not missing(var1) then
  put var1-var10 @@ ;
  end;

  put a
 // 83*'#'
  / '##### Output Data'
  / 83* '#'
 // 'output.Name=' @;

  eof2=0;
  do until(eof2);
  set have end=eof2;
  If not missing(var11) then
  put var11-var20 @@  ;
  end;
  put '1';

  stop;
run;
...