【问题标题】:Convert CSV format as text in email body将 CSV 格式转换为电子邮件正文中的文本
【发布时间】:2018-04-27 22:14:15
【问题描述】:

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

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

正如您在上面看到的,电子邮件的输出被扭曲并且看起来很难看。为了使电子邮件格式与 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

现在我在电子邮件中看到了这个:

您可以注意到,格式比以前好一点。但是如何才能将数据与标题完美对齐?

【问题讨论】:

  • 我认为最好用 libreoffice calc 打开一个 csv。在电子邮件正文中,使用 printf 逐行打印每个字段的格式和对齐方式,就像在控制台中打印一样;然后打开并显示等宽字体的电子邮件。使用 ...
    交替打印 html 电子邮件正文。
  • 不要将图像发布到代码(或数据)中,发布实际文本。

标签: bash perl csv cron


【解决方案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 模块将起作用。

希望这会有所帮助。

【讨论】:

  • 这几乎就是当前的column 命令正在做的事情。但是当使用比例字体查看时,它仍然看起来不对(如问题中的第二张图片所示)。
  • 哇,我想我已经好几年没见过format 使用了!
  • @Sobrique:我记错了,还是在几个版本之前从 Perl 核心中删除了它?
【解决方案2】:

我在电子邮件正文中使用了制表符分隔的字段,这使它更易于阅读。虽然我个人喜欢将实际的 csv 文件作为附件发送,以便可以通过电子表格程序打开和操作。我通常不会将信息通过电子邮件发送给自己,接收端通常只是一个基本的 Windows 用户。可选地,有一个很棒的 perl 模块,它也允许您编写一个真正的 excel 文件,它可以提供一些漂亮的结果。 Excel::Writer::XLSX

【讨论】:

    【解决方案3】:

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

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

    您可以尝试使用制表符分隔输出。这样看起来会更好 - 但仍然会有一些不起作用的情况(因为您并不总是需要在列之间恰好有一个选项卡才能让它们对齐。

    保证您想要的外观的唯一方法是创建一个内容类型为“text/html”的 MIME 电子邮件,并创建一个包含您的数据的 HTML 表格。但这比您目前正在做的工作要多得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      相关资源
      最近更新 更多