Convertir csv en tableau HTML

8

J'ai un Medical.csvfichier avec des lignes de format suivant,

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

Je veux écrire un script bash pour le convertir en table HTML avec field, displayNameet typecomme en-têtes dynamiquement.

Le Csv2HtmlConverter.sh(Inspiré par la réponse lors de la conversion de la table csv en table html ) est

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

Le résultat pour le script ci - dessus est comme ci - dessous qui est bien dans une certaine mesure , mais je veux ajouter <th>field</th>, de façon <th>displayName</th>dynamique.

<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
la source

Réponses:

12

Ça fera l'affaire:

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>"

L'explication de l'expression rationnelle utilisée est sed:

:[^,]*(,|$)

Visualisation des expressions régulières

Cela correspondra à : 'participation.type',et :'participation'\n( $signifie la fin de l'entrée / de la ligne dans l'expression régulière).

rzymek
la source
Fonctionne parfaitement à mes exigences. Le respect.
priagupd
1
Images gracieuseté de debuggex.com
Stéphane Chazelas
0

Voici un script shell qui convertira un CSV en HTML:

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

Pour répondre spécifiquement à votre cas d'utilisation.

En supposant le CSV d'origine suivant:

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

Vous voudrez peut-être le modifier légèrement:

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

Pour produire la version nettoyée suivante:

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

L'exécution du script lié plus tôt sur le CSV d'origine produira le code HTML suivant:

$ 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>

L'exécuter sur le CSV nettoyé produirait:

$ 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
la source
1
Le script, à première vue, ne semble pas gérer le contenu des cellules entre guillemets (qui peut même s'étendre sur plusieurs lignes).
Anthon
D'accord, ce n'est pas le cas. Pourrait certainement ajouter la gestion de cellule citée ou simplement prétraiter avec quelque chose comme:sed 's/"//g' input
Alain Kelder
Ou, si les données contiennent également des guillemets doubles: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
la source
Pouvez-vous reformater votre code pour une meilleure lisibilité. Et ajoutez quelques commentaires ...
Romeo Ninov
0

Je sais que c'est une réponse tardive à cette question, mais cela aidera ceux qui recherchent une solution, pour convertir la sortie de la commande bash au format de table html. Un script simple est disponible pour le faire sur: https://sourceforge.net/projects/command-output-to-html-table/ qui peut être utilisé pour convertir n'importe quelle sortie de commande ou fichier en un joli format de tableau html.

Nathan SR
la source