sas 将 table 插入 html 电子邮件

sas insert table into html email

是否可以遍历 table 的记录来填充 html 电子邮件而不重复电子邮件的开头和结尾?

在这个例子中,我收到一封包含 5 table 行的邮件(因为 WORK.MyEmailTable 是 table 的 5 条记录,并且 set 在数据步骤):

data _null_;
   file mymail;
   set WORK.MyEmailTable;

   put '<html><body><table>';

   ***loop through all records;
   put '<tr>';
   put %sysfunc(cats('<td>',var1,'</td>'));
   put %sysfunc(cats('<td>',var2,'</td>'));
   put %sysfunc(cats('<td>',var3,'</td>'));
   put '</tr>';

   put '</table></body></html>';

run;

我希望有 1 table 行,共 5​​ 行。

不知道有没有办法在数据步骤中使用set时递归地put防止邮件的开头和结尾。

(如果不清楚,请告诉我,我会更新。)

谢谢,

您可以使用 _n_ 自动 datastep 变量让您知道何时进行第一次观察,并使用 set 语句选项 end= 知道您正在进行最后观察:

data _null_;
    file mymail;
    set WORK.MyEmailTable end=eof;

    if _n_ eq 1 then do;
      put '<html><body><table>';
    end;

    /*loop trhough all records*/
    put '<tr>';
    put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var1,'</td>'));
    put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var2,'</td>'));
    put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var3,'</td>'));
    put '</tr>';

    if eof then do;
      put '</table></body></html>';
    end;
run;

我在输出中添加了值 _n_eof,这样您就可以清楚地看到它们是如何工作的。

Rob 的方法几乎是标准方法,但如果您更喜欢编写显式循环脚本(对于非 SAS 程序员来说阅读起来会更舒服),还有另一种选择。这将 完全 像 Rob 的回答一样运行,甚至可以编译成相同的机器代码。

data _null_;
    file mymail;

    put '<html><body><table>';
    do _n_ = 1 by 1 until (eof);
    /*loop trhough all records*/
      set WORK.MyEmailTable end=eof;
      put '<tr>';
      put %sysfunc(cats('<td>',var1,'</td>'));
      put %sysfunc(cats('<td>',var2,'</td>'));
      put %sysfunc(cats('<td>',var3,'</td>'));
      put '</tr>';
    end;
    put '</table></body></html>';
    stop;
run;

_n_ 这里没有任何特殊含义(就像 Rob 的回答中那样);它按惯例使用,因为这样它实际上具有与通常相同的含义。

您需要使用 end=eof 创建一个变量 eof ,该变量在数据集的最后一条记录上为真;否则数据步骤将提前终止(在实际达到您的最终陈述之前)。您还需要 stop 告诉它不要返回到开始 - 否则它会放置一个新的开始部分,然后在它到达 set 时立即终止。 (试试看。)

do _n_=1 by 1 until (eof); 是一种特定于 SAS 的增量循环使用方式;例如,它类似于 c/c++ for (_n_=1; !eof; _n_++) - 它允许您有一个自动递增的 do 循环,同时有一个单独的、不相关的停止条件。