지금 내가 하고 있는 일은 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로 작성된 세 가지 가능한 솔루션을 연구하게 되었습니다.
세 가지 모두 CSV를 읽기 위한 기초로 Text::CSV를 사용합니다.
테이블 패키지를 준비하기 전에는 그냥 수동으로 하려고 했어요. 간단하지만 조금 지루합니다. 최대 필드 길이를 수동으로 결정하고 필요한 섹션을 그려야 합니다. 그럼에도 불구하고 이를 수행하는 적절한 간격의 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. 내가 수행해야 할 작업을 보여주는 예제가 충분하여 필요한 스크립트를 쉽게 작성할 수 있었습니다. 내가 가진 유일한 문제는 "print $table"은 잘 작동하지만 "draw()" 메서드는 작동하지 않는 것 같습니다(아무 작업도 수행하지 않음). 최종 솔루션의 길이는 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);