我现在的情况是希望能够从 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);