如何从 SQuirreL 结果中漂亮地打印 CSV/电子表格?

如何从 SQuirreL 结果中漂亮地打印 CSV/电子表格?

我现在的情况是希望能够从 SQuirreL 获取 SQL 查询结果并将它们作为 ASCII 文本粘贴到各种表单和报告中。使用 SQuirreL,我可以将结果导出为 Excel 或 CSV,但我希望最终将结果格式化为类似这种格式;

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

如果以前没有这样做过,我会感到惊讶,但我对此的搜索却一无所获。

更新

请注意,我看到了https://stackoverflow.com/questions/10518207/tool-to-convert-csv-data-to-stackoverflow-friend-text-only-table,但这些都是网站解决方案。我想要一些可以在命令行上运行的东西。

答案1

我最终研究了三种可能的解决方案,全部都是用 Perl 编写的。

这三个都使用 Text::CSV 作为基础来读取 CSV。

在我决定准备一个 Table 包之前,我只是尝试手动完成。这很简单,但有点乏味。我必须手动确定最大字段长度并绘制所需的部分。即便如此,执行此操作的间隔良好的 Perl 脚本只需要 78 行。

然后我查看了 Perl Text::Table 包,位于http://search.cpan.org/~shlomif/Text-Table-1.131/lib/Text/Table.pm。乍一看,这看起来正是我所需要的。然而,我发现我真的不明白文档,而且例子也没有帮助。我放弃了这个。

然后我发现了 Text::ASCIITable,位于http://search.cpan.org/~lunatic/Text-ASCIITable-0.20/lib/Text/ASCIITable.pm。有足够多的示例展示了我需要做什么,因此可以轻松构建我需要的脚本。我遇到的唯一问题是“draw()”方法似乎不起作用(什么也没做),尽管“print $table”工作得很好。最终的解决方案只有 31 行长。

这是整个脚本:

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

相关内容