Como imprimir uma CSV / planilha bonita a partir de resultados SQuirreL?

2

Eu estou em uma situação onde eu quero ser capaz de obter resultados de consulta SQL de SQuirreL e colá-los como texto ascii em vários formulários e relatórios. Com o SQuirreL, posso exportar resultados como Excel ou CSV, mas gostaria de eventualmente formatar os resultados em algo como este formato;

+---------+--------+-------+
|  header | header | header|
+---------+--------+-------+
|  value  | value  | value |
+---------+--------+-------+

Eu ficaria surpreso se isso não tivesse sido feito antes, mas minhas buscas por isso apareceram vazias.

Atualizar :

Observe que link , mas essas são todas as soluções de sites da web. Eu gostaria de algo que eu possa executar na linha de comando.

    
por David M. Karr 19.09.2016 / 20:22

1 resposta

2

Acabei vendo três possíveis soluções, todas em Perl.

Todos os três usam Text :: CSV como base, para ler no CSV.

Antes de me decidir por um pacote de tabelas preparado, tentei fazer manualmente. Isso foi simples, mas um pouco tedioso. Eu tive que determinar manualmente os comprimentos máximos de campo e desenhar as peças necessárias. Mesmo assim, um script Perl bem espaçado fazendo isso levou 78 linhas.

Em seguida, analisei o pacote Perl Text :: Table, no link . De um olhar muito rápido, isso parecia o que eu precisava. No entanto, descobri que realmente não entendi a documentação e os exemplos não ajudaram. Eu desisti disso.

Eu então descobri o Text :: ASCIITable, no link . Havia exemplos suficientes mostrando o que eu precisava fazer para que fosse fácil construir o script que eu precisava. O único problema que tive foi que o método "draw ()" não parecia funcionar (não fazia nada), embora apenas "print $ table" funcionasse bem. A solução resultante tinha apenas 31 linhas de comprimento.

Este é o script inteiro:

#! /bin/perl
use strict;
use Text::CSV;
use Text::ASCIITable;

my $csv = Text::CSV->new();
my $filename = shift @ARGV;
my $fh;
if (defined $filename) {
    open $fh, "<$filename";
}
else {
    $fh = *STDIN;
}

my $asciitable  = Text::ASCIITable->new();
$asciitable->setOptions('reportErrors', 1);

my $firstRow = $csv->getline($fh);
my @firstRowFields = @$firstRow;
my $numColumns = $#firstRowFields + 1;

$asciitable->setCols(@firstRowFields);

while (my $row = $csv->getline($fh)) {
    $asciitable->addRow($row);
}

print $asciitable;

exit(0);
    
por 20.09.2016 / 20:51

Tags