Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将CSV格式转换为电子邮件正文中的文本_Bash_Perl_Csv_Cron - Fatal编程技术网

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

Bash 将CSV格式转换为电子邮件正文中的文本,bash,perl,csv,cron,Bash,Perl,Csv,Cron,我有一个cron作业,运行该作业时会生成一个csv文件,如下所示: 我有另一个cron工作,我试图在电子邮件正文中直接显示csv数据,其输出如下: 正如您在上面看到的,电子邮件的输出是扭曲的,看起来很难看。要使电子邮件格式与csv格式相似,我应该做哪些更改 我在cron中使用以下bash命令: EMAILBODY="$(${RUNDIR}/${DEV1} ${FILELOCATION} ${FILENAME})" echo "$EMAILBODY" | mailx -r ${SENDER}

我有一个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
现在我在电子邮件中看到:


正如您所注意到的,格式比以前稍微好一点。但是,我如何才能将数据与标题完美地对齐呢?

我在电子邮件正文中使用了制表符分隔的字段,这使它更具可读性。就我个人而言,我喜欢将实际的csv文件作为附件发送,这样就可以通过电子表格程序打开和操作它。我通常不会通过电子邮件向自己发送信息,接收端通常只是一个基本的Windows用户。另外,还有一个很好的perl模块,它允许您编写一个真正的excel文件,它可以提供一些非常好看的结果。Excel::Writer::XLSX

我在电子邮件正文中使用了制表符分隔的字段,这使它更具可读性。就我个人而言,我喜欢将实际的csv文件作为附件发送,这样就可以通过电子表格程序打开和操作它。我通常不会通过电子邮件向自己发送信息,接收端通常只是一个基本的Windows用户。另外,还有一个很好的perl模块,它允许您编写一个真正的excel文件,它可以提供一些非常好看的结果。Excel::Writer::XLSX

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;
}'
请注意,上面的脚本假定每个字段不包含逗号。在这种情况下,Text::CSV模块将起作用


希望这能有所帮助。

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;
}'
请注意,上面的脚本假定每个字段不包含逗号。在这种情况下,Text::CSV模块将起作用


希望这能有所帮助。

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

你有几个问题要解决。使用
columns
是个好主意,但是
columns
(与许多Unix命令行实用程序一样)认为每个人仍然生活在具有固定宽度字体的Unix控制台中。你看到的轻微的不一致是由于你使用比例字体查看电子邮件,所以不是所有的字符都是相同的宽度

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


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

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

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

你可以尝试用制表符来分隔输出,这样看起来会更好,但是仍然会有一些情况不起作用(因为你并不总是需要在列之间只使用一个制表符来对齐它们)


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

我认为最好使用libreoffice calc打开一个csv。在电子邮件正文中,使用printf逐行打印,每个字段的格式和对齐方式与在控制台中打印相同;然后使用monospace字体打开并显示电子邮件。Alternatevely打印带有…的html电子邮件正文,不要将图像发布到代码(或数据)中,发布实际文本。我认为最好使用libreoffice calc打开csv。在电子邮件正文中,使用printf逐行打印,每个字段的格式和对齐方式与在控制台中打印时相同;然后使用monospace字体打开并显示电子邮件。或者使用…打印html电子邮件正文,不要将图像发布到代码(或数据),发布实际文本。这与当前的
命令所做的差不多。但是,使用比例字体查看时,它看起来仍然是错误的(如问题中的第二幅图像所示).Wow,我想我已经多年没有看到使用
格式了!@Sobrique:我是记错了,还是在几次发布后从Perl core中删除了它?这正是当前的
命令所做的。但是使用比例字体查看它时,它仍然看起来是错误的(如问题中的第二张图片所示).Wow,我想我已经多年没有看到使用
格式了!@Sobrique:我是记错了,还是在几次发布之前从Perl core中删除了它?