Converter arquivo de texto com valores separados por dois pontos para tabela html

2

Eu tenho um arquivo grande com mais de 10000 registros formatados como abaixo.

Isso precisa ser convertido em uma tabela html

Eu tentei várias maneiras de converter em csv e depois em html etc, mas até agora não consegui obter a saída desejada

Data.txt

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

Eu quero que isso seja convertido em uma tabela "html" como esta:

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

Eu preciso processar arquivos de 10000 registros. Como posso fazer isso?

    
por user261334 30.01.2015 / 21:56

2 respostas

0

Isso seria muito mais curto, se eu soubesse como fazer várias substituições de pesquisa no sed. eu não. Ah bem. depois disso, ficou bobo. sem awk necessário. Estou supondo que seu arquivo de dados é chamado bs.dat e que você deseja um csv para migrar para um sistema de banco de dados real mais tarde. saída para um arquivo html incrível também ... pode precisar de algum css. Essa saída ruim é compatível com html5. (como é)

#!/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

Dado que você tem um arquivo de dados grande, você pode optar por remover os arquivos p1-p4 anteriormente. a saída CSV será um arquivo menor, assim como todas as saídas consecutivas, mas é disco intensivo, fiz esforço Zero para a eficiência & amp; conservação de uso de recursos.

Além disso: os nomes serão empurrados juntos. Espere, não vejo FirstName LastName nestes dados. Eu suponho que eles realmente existem, mas foram omitidos por simplicidade ... Há uma correção simples para isso, usando REGEX. onde existe [a-z] [A-Z] no valor da primeira coluna, insira um espaço

    
por j0h 31.01.2015 / 05:32
3

Funciona com o gawk ou o nawk, mas não o mawk.

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

Isso pressupõe que haverá exatamente 3 linhas para cada registro, no nome do pedido, idade, tagid

    
por glenn jackman 30.01.2015 / 22:15