You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

方案说明

  1. 核心逻辑:通过(NF-3)/3计算当前主机的设备数量,实现单条CSV行拆分多设备表格行
  2. 布局适配:第一台设备显示完整主机信息,后续设备空出前3列,主机间添加空行分隔,匹配预期格式
  3. 样式保留:保留原需求的字体、边框样式,电池状态按阈值标记颜色(电量>50为绿色,否则红色)
  4. 空行处理:自动跳过原始CSV中的空行,避免生成无效表格行

内容的提问来源于stack exchange,提问作者bharat mani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:17:23