SAS打印到自定义报告

时间:2018-12-10 04:56:48

标签: sas

我正在尝试通过我的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 :(得分:0)

我不确定问题的原因。但是有时候,如果您一次读取一个数据集几次,SAS就会表现得很奇怪。但是第二秒钟~/.bash_profile使用另一个变量可以解决问题:

set have end=eof2;

答案 1 :(得分:0)

在读取集合的最后一条记录后尝试进行读取时,“普通” 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;