sas将表插入到html电子邮件中

时间:2015-10-21 14:02:30

标签: sas enterprise-guide datastep

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

通过这个例子,我得到一个包含5个1行表的邮件(因为if (name.equals(p.getValue().getName())) 是5个记录的表,WORK.MyEmailTable在数据步骤中创建了一个循环):

set

我希望有一张5行的桌子。

在数据步骤中使用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; 时,我不知道是否有办法阻止邮件的开始和结束递归put

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

谢谢,

2 个答案:

答案 0 :(得分:2)

您可以使用_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添加到输出中,以便您可以清楚地看到它们的工作原理。

答案 1 :(得分:1)

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,该变量在数据集的最后一条记录中为true;否则数据步骤将提前终止(在实际敲击最终声明之前)。您还需要stop告诉它不要回到开头 - 否则它会,并且会放置一个新的起始部分,然后在它到达set时立即终止。 (试试看看。)

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