将以冒号分隔值的文本文件转换为 HTML 表格

将以冒号分隔值的文本文件转换为 HTML 表格

我有一个大文件,其中包含超过 10000 条记录,格式如下。

这需要转换为 html 表格

我尝试了各种方法将其转换为 csv,然后转换为 html 等,但到目前为止我还没有得到想要的输出

Data.txt

Name       : john
age        : 20
tag id     : 1234567
Name       : Mark
age        : 40
tag id     : 832245
Name       : tom
age        : 60
tag id     : 789324
......

我希望将其转换为这样的“html”表:

Name    Age   Tagid
John     20   1234567
Mark    40     832245
tom     60     789324

我需要处理 10000 条记录的文件。我该怎么做?

答案1

可以与 gawk 或 nawk 配合使用,但不能与 mawk 配合使用。

awk -F '[[:blank:]]*:[[:blank:]]*' '
    BEGIN {print "<table><thead><tr><th>Name</th><th>Age</th><th>Tagid</th></tr></thead><tbody>"}
    {
        name  = $2; getline
        age   = $2; getline
        tagid = $2
        print "<tr><td>" name "</td><td>" age "</td><td>" tagid "</td></tr>"
    }
    END {print "</tbody></table>"}
' Data.txt > Data.html

假设每条记录恰好有 3 行,顺序为名称、年龄、标签 ID

答案2

如果我知道如何在 sed 中进行多次搜索替换,那么这个会短得多。我不知道。哦,好吧。之后,它变得很愚蠢。不需要 awk。我假设您的数据文件名为 bs.dat,并且您想要一个 csv 以便稍后迁移到真正的数据库系统。输出到一个很棒的 html 文件......可能需要一些 css。这个糟糕的输出符合 html5 标准。(原样)

#!/bin/bash
touch me lel.html
rm me lel.html
touch me p1 p2 p3 p4 lel.html
#Fix BS data make a proper csv
c=","
#remove spaces
cat bs.dat  | sed 's/ //g' > p1
#remove Name:
cat p1  | sed 's/Name://g' > p2
#Remove age:
cat p2  | sed 's/age://g' > p3
#remove tagid:
cat p3  | sed 's/tagid://g' > p4
#make a csv
file=p4
i=1
while read line
    do
        if [ "$i" = "1" ]; then
            l1=$line$c && i=2 
        elif [ "$i" = "2" ]; then
            l2=$l1$line$c && i=3
        elif [ "$i" = "3" ]; then
            l3=$l2$line >> me && i=1 && echo $l3 >> me
        else
            echo "something went wrong: $line"
        exit
        fi    
    done <"$file"
rm p1 p2 p3 p4
#Cool now we have a proper csv for later when we need to migrate to a real database
#ok lets make some html
touch lel.html

echo "<!DOCTYPE html><html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">" > lel.html
echo "<meta content=\"code, bash, lolz\" name=\"keywords\" /><title>IDK what</title></head><body>" >> lel.html
echo "<pre>Name          Age          ID  " >> lel.html
while IFS=, read col1 col2 col3
do
    echo "$col1 $col2 $col3" >> lel.html
done < me

echo "</pre></body></html>" >> lel.html 
firefox lel.html

假设您有一个大型数据文件,您可以选择尽早删除 p1-p4 文件。csv 输出将是一个较小的文件,所有连续的输出也将如此,但它占用大量磁盘空间,我没有为效率和资源使用节省做出任何努力。

另外:姓名将被推到一起。等等,我没有在这些数据中看到 FirstName LastName。我假设它们确实存在,但为了简单起见被省略了……有一个简单的解决方法,使用 REGEX。在第一列值中有 [az][AZ] 的地方,插入一个空格

相关内容