将CSV转换为指定格式HTML用于邮件发送的技术求助
问题:将CSV转换为多设备行合并的HTML表格用于邮件发送
原始CSV文件内容 (file.csv)
Android_1,10.24.420.105,Attached,0A251FDD4000D1/13,27071JEGR10369/12,4075252kB,2387900kB,100,76 And_perf,10.24.424.99,Attached,93BAY08V2A/10,FA7AK1A02097/10,G0011K05020607NC/9,2111612kB,2028448kB,596888kB,100,88,98
字段说明
- 第1列:主机名
- 第2列:主机IP地址
- 第3列:设备连接状态
- 后续N列:连接设备名称/版本(数量等于该主机连接的设备数)
- 再后续N列:对应设备的可用内存
- 最后N列:对应设备的电池状态
预期HTML表格可视化效果
MACHINE_NAME IP_ADD DEVICE_CONN CONN_DEVICE_NAME/OS_VERSION MEMORY_AVAILABLE BATTERY_LEVEL Android_1 10.24.420.105 Attached 0A251FDD4000D1/13 4075252kB 100 27071JEGR10369/12 2387900kB 76 And_perf 10.24.424.99 Attached 93BAY08V2A/10 2111612kB 100 FA7AK1A02097/10 2028448kB 88 G0011K05020607NC/9 596888kB 98
之前尝试的无效命令
第一步:生成file2.csv
awk 'BEGIN{print "MACHINE_NAME,IP_ADDRESS,DEVICE_CONNECTED,CONNECTED_DEVICE_NAME,DEVICE_OS_VERSION,MEMORY_AVAILABLE,BATTERY_LEVEL%"}; {print $0};' file.csv | tee file2.csv
第二步:转换为HTML
awk -F ',' 'BEGIN { FS=","; print "<html><head><style>table {font: 2.1ex calibri}" print ".green {border: 1px solid green}" print ".red {border: 1px solid red}" print ".sample {border: 1px solid red; color:white}" print "td:first-child {width:150px}</style></head>" print "<body><br><br><table width=500 border=2 cellspacing=2 cellpadding=2 border-collapse=collapse>"} NR == 1 { print "<tr bgcolor=\"#FAD7A0\">"; for ( i = 1; i <= NF; i++ ) print "<td><b>" $i "</b></td>"; print "</tr>"} NR > 1 { print "<tr>"; for ( i = 1; i <= NF; i++ ) print "<td" (i==7? " class=" ($i>50?"green":"red"):"" ) ">" $i "</td>"; print "</tr>"} END { print "</table></body></html>}' \ file2.csv > file.html
错误结果
生成的邮件内容未拆分多设备行,直接原样显示CSV逗号分隔内容:
MACHINE_NAME IP_ADD DEVICE_CONN CONN_DEVICE_NAME/OS_VERSION MEMORY_AVAILABLE BATTERY_LEVEL Android_1,10.24.420.105,Attached,0A251FDD4000D1/13,27071JEGR10369/12,4075252kB,2387900kB,100,76 And_perf,10.24.424.99,Attached,93BAY08V2A/10,FA7AK1A02097/10,G0011K05020607NC/9,2111612kB,2028448kB,596888kB,100,88,98
正确解决方案
使用单条awk命令直接处理原始CSV,生成符合要求的HTML表格:
awk -F ',' ' BEGIN { print "<html><head><style>" print "table {font: 2.1ex calibri; border-collapse: collapse; width: 80%;}" print "th, td {border: 2px solid #000; padding: 8px; text-align: left;}" print "th {background-color: #FAD7A0; font-weight: bold;}" print ".green {border-color: green;}" print ".red {border-color: red;}" print "</style></head><body><br><br>" print "<table>" print "<tr><th>MACHINE_NAME</th><th>IP_ADD</th><th>DEVICE_CONN</th><th>CONN_DEVICE_NAME/OS_VERSION</th><th>MEMORY_AVAILABLE</th><th>BATTERY_LEVEL</th></tr>" } # 跳过空行 NF == 0 { next } NR > 0 { # 计算当前主机的设备数量:(总字段数-3)/3,每个设备对应名称、内存、电池3个字段 device_count = (NF - 3) / 3 # 遍历每个设备生成行 for (i = 0; i < device_count; i++) { print "<tr>" # 第一台设备显示完整主机信息,后续设备空出前3列 if (i == 0) { print "<td>" $1 "</td>" print "<td>" $2 "</td>" print "<td>" $3 "</td>" } else { print "<td></td>" print "<td></td>" print "<td></td>" } # 设备名称/版本 print "<td>" $(4 + i) "</td>" # 可用内存 print "<td>" $(4 + device_count + i) "</td>" # 电池状态,按阈值添加样式 battery = $(4 + 2*device_count + i) class = (battery > 50) ? "green" : "red" print "<td class=\"" class "\">" battery "</td>" print "</tr>" } # 主机之间添加空行分隔 print "<tr><td colspan=\"6\"></td></tr>" } END { print "</table></body></html>" }' file.csv > file.html
方案说明
- 核心逻辑:通过
(NF-3)/3计算当前主机的设备数量,实现单条CSV行拆分多设备表格行 - 布局适配:第一台设备显示完整主机信息,后续设备空出前3列,主机间添加空行分隔,匹配预期格式
- 样式保留:保留原需求的字体、边框样式,电池状态按阈值标记颜色(电量>50为绿色,否则红色)
- 空行处理:自动跳过原始CSV中的空行,避免生成无效表格行
内容的提问来源于stack exchange,提问作者bharat mani
相关产品推荐
相关产品推荐

