4

データを収容するために列が広がるようにコードを変更したいと考えています。

以下は壊れた行の例です

+========+=========+===============+=============+=============+
| Record | Cluster | Current Build | Current Use | Environment |
+--------+---------+---------------+-------------+-------------+
| 3      | 1       | v44           | v44 Live (currently - new company cluster)| PROD        |
+--------+---------+---------------+-------------+-------------+

これが私が使用している(不器用な)コードです

sub printData {
   if (@_) {
      # print the data grid top border
      printf ("%10s%10s%15s%14s%14s",'+'.('=' x 8).'+',('=' x 9).'+',('=' x 15).'+',('=' x 13).'+',('=' x 13).'+');
      print "\n";
      # print the data grid column titles
      printf ("%-9s%-10s%-16s%-14s%-15s",'| Record ','| Cluster ','| Current Build ','| Current Use ','| Environment |');
      print "\n";

      # print out each row of data
      foreach my $rows (@_) {

         # print the data grid demarcation border
         printf ("%10s%10s%15s%14s%14s",'+'.('-' x 8).'+',('-' x 9).'+',('-' x 15).'+',('-' x 13).'+',('-' x 13).'+');
         print "\n";

         # print each data cell
         printf ("%-9s",'| '.$rows->{'Record ID#'});
         printf ("%-10s",'| '.$rows->{'Cluster'});
         printf ("%-16s",'| '.$rows->{'Current Build'});
         printf ("%-14s",'| '.$rows->{'Current Use'});

            # calculate the length of the last column
            my $length = length($rows->{'Environment'});

            # calculate how many spaces to add to the last column
            # the title of this column uses 15 characters (including '|' and spaces)
            # we already used three of those spaces for 2 '|' characters  and 1 leading space
            # so 15 - 3 = 12 
            # then subtract the length of the return string from 12
            my $spaces = 12 - $length;

         # we print the last data cell plus the padding spaces calculated above
         printf ("%-15s",'| '.$rows->{'Environment'}.(' ' x $spaces).'|');
         print "\n";
      }

      # we print the bottom data grid border
      printf ("%10s%10s%15s%14s%14s",'+'.('=' x 8).'+',('=' x 9).'+',('=' x 15).'+',('=' x 13).'+',('=' x 13).'+');
      print "\n";
    }
   else {  
      if ($debug) {
         print "trouble with printData subroutine\n";
      }
      return 0;
    }
}
4

4 に答える 4

9

Text::Tableは、データに合わせて列幅を調整します。

于 2011-08-25T23:23:20.787 に答える
3

データを事前にスキャンして各フィールドの最大幅を取得してから、フォーマット文字列を作成する必要があります。

于 2011-08-25T21:39:42.197 に答える
2

Text::SimpleTable::AutoWidthは非常に簡単で、Text::Table よりも手間がかかりません。

于 2011-08-25T23:49:17.367 に答える
2

既に提案されているモジュールのいずれにも精通していないため、希望どおりに機能しない場合は、Mouse Food が提案したようにデータを事前スキャンして、各列の最大幅を取得します。これらの最大幅は、出力時にフォーマット文字列で使用されます。可能であれば、最後に 2 回反復するよりも、配列の作成中にこの最大値を取得する方がおそらく効率的です。

以下のコードは、配列全体を繰り返し処理して列の最大長を見つけますが、計算しながらそれを計算する場合は、簡単に適応させることができます。また、私はこれをカフから書き留めてテストしていませんが、アイデアを提供するはずです.

my %maximums = {
    "Record ID#" => 0,
    "Cluster" => 0,
    "Current Build" => 0,
    "Current Use" => 0
};

# calculate the maximum length of the values in each column
foreach my $row (@_) {
    foreach my $col (keys %maximums) {
        my $col_length = length($row->{$col});
        $maximums{key} = $col_length if ($col_length > $maximums{$col});
    }
}

# Generate a format string using the maximum column widths.  Other format strings
# may be generated in this loop for the other parts of the table.  Alternatively
# you could probably transform the one string and replace the characters in it.
my $row_format = "|";
foreach my $col (keys %maximums) {
    $row_format .= " %-",$maximums{$key},"s |";
}
$row_format .= "\n";

# Print your headers and borders here, using the other format strings that you
# would calculate above (where $row_format is generated).

# Print each row in the table
foreach my $row (@_) {
    printf($row_format, $row->{"Record ID#"}, $row->{"Cluster"},
        $row->{"Current Build"}, $row->{"Current Use"});
}
于 2011-08-26T03:01:48.493 に答える