将CSV格式转换为电子邮件正文中的文本

时间:2017-11-14 20:32:05

标签: bash perl csv cron

我有一个cron作业,运行时给我一个csv文件,如下所示: enter image description here

我有另一个cron作业,我试图直接在电子邮件正文中显示csv数据,其输出如下: enter image description here

正如您在上面所看到的,电子邮件的输出是扭曲的,看起来很丑陋。我应该使电子邮件格式与csv格式类似吗?

我在我的cron中使用以下bash命令:

EMAILBODY="$(${RUNDIR}/${DEV1} ${FILELOCATION} ${FILENAME})"

echo "$EMAILBODY" | mailx -r ${SENDER} -s "Alerts Email for $(date +%Y-%m-%d_%H:%M)" abcd@xyz.com

我尝试了以下对脚本的更改:

echo "$EMAILBODY" | column -s, -t | mailx -r ${SENDER} -s "Alerts Email for $(date +%Y-%m-%d_%H:%M)" abcd@xyz.com

现在我在电子邮件中看到了这个: enter image description here

正如您所注意到的,格式比以前好一些。但是,如何将数据与标题完美对齐?

3 个答案:

答案 0 :(得分:1)

Perl将是一个用于对齐文本字段的合适工具。 请尝试以下代码:

#!/bin/bash

echo "$EMAILBODY" | perl -e '
format STDOUT =
@>>>>>>> @<<<<<<<<<<<<<<<<<< @>>>>>>> @<<<<<<<<<<<<<< @<<<<<<<< @<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$id, $type, $site, $city, $prov, $start, $elasp
.

while (<>) {
    split(/,/, $_);
    grep {s/^"//, s/"$//} @_;
    ($id, $type, $site, $city, $prov, $start, $elasp) = @_;
    write;
}'

结果如下:

Alert ID Type                IOL Site City            Province  Alert Start Time    Elasped Time since first alert
       4 Trasaction Alert       99196 NANAIMO         BC        2015-06-30 15:11:00     867 23:00
       6 Communication Alert    88395 GRANDE PRAIRIE  AB        2015-07-01 15:23:39     866 22:48
       7 Communication Alert    88433 HINTON          AB        2015-07-01 15:23:39     866 22:48
       8 Communication Alert    88484 LAC LA BICHE    AB        2015-07-01 15:23:39     866 22:48
      11 Transation Alert       88395 GRANDE PRAIRIE  AB        2015-07-02 16:40:59     865 22:53

请注意,上面的脚本假定每个字段都不包含逗号。在这种情况下,Text :: CSV模块将起作用。

希望这有帮助。

答案 1 :(得分:0)

我在电子邮件正文中使用了TAB分隔字段,这使得它更具人性化。我个人虽然喜欢将实际的csv文件作为附件发送,但它可以通过电子表格程序打开和操作。我通常不会将信息通过电子邮件发送给自己,而接收端通常只是一个基本的Windows用户。可选地,有一个很棒的perl模块,它允许你编写一个真正的excel文件,这可以给出一些很棒的结果。的Excel ::作家:: XLSX

答案 2 :(得分:0)

首先,说你有“一个看起来像下面的csv文件”并不准确。当您在电子表格程序中打开它时,您有一个CSV文件。

这里有一些问题需要解决。使用columns是一个好主意,但columns(像许多Unix命令行实用程序一样)认为每个人仍然使用固定宽度字体的Unix控制台。您看到的轻微错位取决于您使用比例字体查看电子邮件,因此并非所有字符都具有相同的宽度。

您可以尝试使用制表符分隔输出。这看起来会更好 - 但仍然会有一些不起作用的情况(因为你并不总是需要在列之间只有一个标签才能让它们排成一行。

保证所需外观的唯一方法是创建内容类型为“text / html”的MIME电子邮件,并创建包含数据的HTML表格。但是,你正在做的事情还有很多工作要做。