Ubah tabel csv ke HTML

8

Saya punya Medical.csvfile dengan deretan format berikut,

    field: 'participation.type', displayName: 'program_type', type: 'String',path:'participation'
    field: 'participation.program', displayName: 'program_name', type: 'String',path:'participation'

Saya ingin menulis skrip bash untuk mengubahnya menjadi tabel HTML dengan field, displayNamedan typesebagai tajuk secara dinamis.

The Csv2HtmlConverter.sh(Terinspirasi oleh jawaban di Convert csv ke tabel html menggunakan ) adalah

    echo "<table>" ;
    while read INPUT ; do
            echo "<tr><td>${INPUT//,/</td><td>}</td></tr>" ;
    done < Medical.csv ;
    echo "</table>"

Hasil untuk skrip di atas adalah seperti di bawah ini yang baik-baik saja sampai batas tertentu tetapi saya ingin menambahkan <th>field</th>, <th>displayName</th>secara dinamis.

<table>
<tr><td>field: 'participation.type'</td><td> displayName: 'program_type'</td><td> type: 'String'</td><td>path:'participation'</td></tr>
<tr><td>field: 'participation.program'</td><td> displayName: 'program_name'</td><td> type: 'String'</td><td>path:'participation'</td></tr>
</table>
prayagupd
sumber

Jawaban:

12

Ini akan melakukan trik:

echo "<table>" ;
print_header=true
while read INPUT ; do
  if $print_header;then
    echo "<tr><th>$INPUT" | sed -e 's/:[^,]*\(,\|$\)/<\/th><th>/g'
    print_header=false
  fi
  echo "<tr><td>${INPUT//,/</td><td>}</td></tr>" ;
done < Medical.csv ;
echo "</table>"

Penjelasan dari regex yang digunakan adalah sed:

:[^,]*(,|$)

Visualisasi ekspresi reguler

Ini akan cocok : 'participation.type',dan :'participation'\n( $berarti akhir input / baris di regex).

rzymek
sumber
Bekerja dengan baik untuk persyaratan saya. Menghormati.
prayagupd
1
Gambar milik debuggex.com
Stéphane Chazelas
0

Berikut ini skrip shell yang akan mengonversi CSV ke HTML:

http://giantdorks.org/alain/bash-and-awk-to-convert-delimited-data-csv-tsv-etc-to-html-tables/

Untuk menangani kasus penggunaan Anda secara khusus.

Dengan asumsi CSV asli berikut:

$ cat original.csv 
field: 'participation.type', displayName: 'program_type', type: 'String',path:'participation'
field: 'participation.program', displayName: 'program_name', type: 'String',path:'participation'

Anda mungkin ingin sedikit memodifikasinya:

$ echo field,displayName > modified.csv
$ awk -F"'" 'OFS="," {print$2,$4}' original.csv >> modified.csv

Untuk menghasilkan versi pembersihan berikut:

$ cat modified.csv 
field,displayName
participation.type,program_type
participation.program,program_name

Kemudian menjalankan skrip yang ditautkan sebelumnya pada CSV asli, akan menghasilkan HTML berikut:

$ csv2htm.sh --head original.csv 
  <table>
    <thead>
      <tr>
        <th>field: 'participation.type'</th>
        <th> displayName: 'program_type'</th>
        <th> type: 'String'</th>
        <th>path:'participation'</th>
      </tr>
    </thead>
      <tr>
        <td>field: 'participation.program'</td>
        <td> displayName: 'program_name'</td>
        <td> type: 'String'</td>
        <td>path:'participation'</td>
      </tr>
  </table>

Menjalankannya di CSV yang telah dibersihkan, akan menghasilkan:

$ csv2htm.sh --head modified.csv
  <table>
    <thead>
      <tr>
        <th>field</th>
        <th>displayName</th>
      </tr>
    </thead>
      <tr>
        <td>participation.type</td>
        <td>program_type</td>
      </tr>
      <tr>
        <td>participation.program</td>
        <td>program_name</td>
      </tr>
  </table>
Alain Kelder
sumber
1
Skrip, pada pandangan pertama, tampaknya tidak menangani konten sel yang dikutip (yang bahkan dapat menjangkau beberapa baris).
Anthon
Benar tidak. Tentu saja dapat menambahkan penanganan sel yang dikutip atau hanya preprocess dengan sesuatu seperti:sed 's/"//g' input
Alain Kelder
Atau, jika data juga mengandung tanda kutip ganda:sed 's/^"//;s/"$//;s/","/,/g;' input.csv
Alain Kelder
0
host=`hostname`
now=`date +"%d-%b-%y"`
now=`echo $now| tr '[a-z]' '[A-Z]'`
yest=`TZ=CST+24 date +%d-%b-%y`
yest=`echo $yest| tr '[a-z]' '[A-Z]'`
sub="Jobs-$host-$now-HealthReport"

if [ -s jobs.csv ]
then
awk 'BEGIN{
FS=","
print "<HTML>""<TABLE border=1 width='100%' align='centre' ><tr bgcolor='#000080'><TH><FONT COLOR='#FFFFFF'>HSCR-DBMSJOB HEALTH REPORT  </TH></FONT>"
print "</TABLE>"
print "<HTML>""<TABLE border=1 width='100%' align='centre' bgcolor='#C6C6C6' BORDERCOLOR='#CCFF00' ><tr bgcolor='#5F9EA0'><TH>SUMMARY</TH>"
print "</TABLE>"
print "<HTML><TABLE border=2 width='100%' align='centre' BORDERCOLOR='#330000' ><trbgcolor='#FFFFCC'>"

print "<TH>BROKEN</TH><TH>SCHEMA_USER</TH><TH>JOB_ID</TH><TH>LAST_DATE</TH><TH>LAST_SEC</TH><TH>THIS_DATE</TH>"
print "<TH>THIS_SEC</TH><TH>NEXT_DATE</TH><TH>NEXT_SEC</TH><TH>NAME</TH>"
}


{
    printf "<TR>"
            for(i=1;i<=10;i++){

                      if(i == 1 && $i == "N" || i == 4 && $i == n || i == 4 && $i == y )
                    {
                            printf "<TD bgcolor='#75923C'>%s</TD>", $i
                    }
                    else if(i == 1 && $i == "Y" || i == 4 && $i != n && $i != y)
                    {
                            printf "<TD bgcolor='#FF0000'>%s</TD>", $i
                    }
                    else
{
                            printf "<TD>%s</TD>", $i
}
            }
            print "</TR>"
    }

END{

            print "</TABLE></BODY></HTML>"
    }' y="$yest" n="$now" jobs.csv > jobstatus-$host-$now.html
else
echo "file not found"

fi
Rajesh Mestri
sumber
Bisakah Anda memformat ulang kode Anda agar lebih mudah dibaca. Dan tambahkan beberapa komentar ...
Romeo Ninov
0

Saya tahu ini adalah jawaban terakhir untuk pertanyaan ini, tetapi akan membantu mereka yang mencari solusi, untuk mengkonversi output perintah bash ke format tabel html. Ada skrip mudah yang tersedia untuk melakukan ini di: https://sourceforge.net/projects/command-output-to-html-table/ yang dapat digunakan untuk mengkonversi output perintah atau file ke format tabel html yang bagus.

Nathan SR
sumber