Arquivo HTML para apresentar dados CSV

Suponha que você tenha alguns arquivos com valores separados por virgula (CSV) e deseja apresentá-los para alguém. Você pode abrir um por um no seu programa de editar planilhas, arrumar as colunas para que os dados fiquem visíveis, converter ponto pra vírgula, juntar as tabelas em uma página só para comparação, etc ou criar um script que faça isso para você.

Uma forma de apresentar os dados em tabelas pode ser através de HTML. Essa linguagem, aliada ao CSS, pode deixar um resultado bem apresentável e de fácil compreensão de quem vê. Como é muito chato montar uma tabela HTML “na mão” sem um modelo, você pode usar um shell script para gravar um arquivo HTML contendo a estrutura básica de marcação do HTML e as propriedades de estilo do CSS.

O shell script do exemplo a seguir cria um arquivo HTML com título, subtítulo, insere imagem e cria tabela com cabeçalho, com todos os elementos centralizados. Por fim, converte o HTML em PDF (opcional).

#!/bin/bash
# Script para fazer tabelas em HTML com textos a partir de arquivos CSV e gravar também relatório em PDF

DIR=$(readlink -f -- $0 | awk -F "/" 'sub(FS $NF,x)')/dados
file_in=$DIR/tabela.csv
file_out=$DIR/tabela_relatorio.html
dia=$(date +%Y-%m-%d)

echo "<html>" > $file_out
echo "<head>" >> $file_out
echo "<meta charset='UTF-8'>" >> $file_out
echo "<style type='text/css'>" >> $file_out
echo "table { margin-left: auto;margin-right: auto;}" >> $file_out
echo "</style>" >> $file_out
echo "</head>" >> $file_out
echo "<Body>" >> $file_out
echo "<h2 align='center'>Relatorio</h2>" >> $file_out
echo "<h3 align='center'>(gerado em $dia)</h3></br>" >> $file_out
echo "</br>" >> $file_out

# Ler CSV e montar tabela HTML
echo "<table>"  >> $file_out
print_header=true
while read INPUT ; do
	if $print_header; then
		echo "<tr><th>${INPUT//,/</th><th>}</th></tr>" >> $file_out
		print_header=false
	else
		echo "<tr><td align='center'>${INPUT//,/</td><td align='center'>}</td></tr>" >> $file_out
	fi
done < $file_in
echo "</table></br>" >> $file_out

echo "</Body>" >> $file_out
echo "</html>" >> $file_out

echo "HTML feito"

# Gerar arquivo PDF a partir de HTML
wkhtmltopdf $file_out $DIR/relatorio.pdf
echo "PDF feito"

Esse outro exemplo é um pouco mais complexo, pois imprime várias tabelas em um mesmo HTML. São arquivos de 4 lugares e 3 datas, totalizando 12 combinações – ou seja, 12 arquivos de entrada no formato CSV. O exemplo abaixo criar um arquivo de saída com as seguintes configurações:

  • uma DIV (envolve) que contém todo o conteúdo a ser gravado;
  • três DIVs (div_1, div_2 e div_3, uma ao lado da outra), cada uma com um título indicando a data (a do meio tem fundo cinza);
  • cada DIV possui quatro tabelas (uma embaixo da outra), cada uma contendo o nome do lugar no próprio arquivo CSV;
  • cada tabela possui um cabeçalho, que será impresso de modo diferente (“th” em vez de “td”).

As propriedades de estilo estão definidas no início do scripts para serem gravadas no arquivo de saída.

#!/bin/bash
# Script para fazer tabelas em HTML a partir de arquivos CSV

DIR=$(pwd)

# Impressão de cabeçalho HTML/CSS
echo "<html>" > $DIR/tabela.html
echo "<style type='text/css'>" >> $DIR/tabela.html
echo "#envolve { width: 100%;}" >> $DIR/tabela.html
echo "#div_1 { float: left; text-align: center;}" >> $DIR/tabela.html
echo "#div_2 { background-color: #F0F0F0; float: left; text-align: center;}" >> $DIR/tabela.html
echo "#div_3 { float: left; text-align: center;}" >> $DIR/tabela.html
echo "#clear { clear:both; }" >> $DIR/tabela.html
echo "</style>" >> $DIR/tabela.html
echo "<Body>" >> $DIR/tabela.html
echo "<div id='envolve'>" >> $DIR/tabela.html

# Inicialização de vetores para criar nomes dos arquivos CSV
datas=("2001-06-01" "2007-01-01" "2014-01-01")
subs=("Lugar1" "Lugar2" "Lugar3" "Lugar4")

i=1
for data in "${datas[@]}"; do
	echo "<div id='div_"$i"'>" >> $DIR/tabela.html
	echo "Dados de "$data"" >> $DIR/tabela.html
	k=0
	# Criar nomes de arquivos CSV a serem lidos
	for local in ${locais[@]}; do
		files[k++]=$DIR/$local"_"$data".csv"
	done
	# Ler cada arquivo CSV
	for file_in in "${files[@]}"; do
		echo "<table>"  >> $DIR/tabela.html
		print_header=true
		# Gravar linhas da tabela
		while read INPUT ; do
			if $print_header; then
				echo "<tr><th>${INPUT//,/</th><th>}</th></tr>" >> $DIR/tabela.html
				print_header=false
			else
				echo "<tr><td align='center'>${INPUT//,/</td><td align='center'>}</td></tr>" >> $DIR/tabela.html
			fi
		done < $file_in
		echo "</table></br>" >> $DIR/tabela.html
	done
	i=$((i+1))
	echo "</div>" >> $DIR/tabela.html
done

# Finalizar dotumento HTML
echo "<div class='clear'></div>" >> $DIR/tabela.html
echo "</Body>" >> $DIR/tabela.html
echo "</html>" >> $DIR/tabela.html

echo "HTML feito"

O script “faz_tabelas.sh” gera o arquivo de saída “tabela.html”, que pode ser aberto em qualquer navegador.

One comment

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.