Perl: printf

Hi,

ich habe folgenden Code, der mit bei der Ausgabe etwas Probleme macht:

Code:
#!/usr/bin/perl -w
use strict;
use warnings FATAL => 'all';
use DBI;

my $dbargs = {AutoCommit => 0, PrintError =>1};
my $dbh = DBI->connect("dbi:SQLite:dbname=database.db", "", "", $dbargs);

my $res = $dbh->selectall_arrayref("SELECT * FROM customer ORDER BY id;");

if ($dbh->err()) { die "$DBI::errstr\n"; }
$dbh->disconnect();

my $row;
foreach $row (@$res)
{
        my @data = @$row;
        printf("%-2s | %-20s | %-25s | %-8s | %-20s | %s\n", $data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
}

Die Ausgabe sieht so aus:

Code:
mathias@x61t:~/src/accounting$ ./customer-list.pl 
1  | Max Mustermann     | Pirckheimerstraße 129    | 90419    | Nürnberg            | DE
2  | Max Mustermaaaann   | Mariental 3               | 91278    | Pottenstein          | DE
3  | Max Mustermaaaaann     | Rathsbergerstraße 28     | 91054    | Erlangen             | DE
mathias@x61t:~/src/accounting

Trotz der Angabe %-20s habe ich Verschiebungen in der Formatierung. Warum?

cu
serow
 
Code:
        printf("%-2s | %-20s | %-25s | %-8s | %-20s | %s\n", $data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
}
Die Ausgabe sieht so aus:

Code:
mathias@x61t:~/src/accounting$ ./customer-list.pl 
1  | Max Mustermann     | Pirckheimerstraße 129    | 90419    | Nürnberg            | DE
2  | Max Mustermaaaann   | Mariental 3               | 91278    | Pottenstein          | DE
3  | Max Mustermaaaaann     | Rathsbergerstraße 28     | 91054    | Erlangen             | DE
mathias@x61t:~/src/accounting
Trotz der Angabe %-20s habe ich Verschiebungen in der Formatierung. Warum?

Du reservierst (%-2s) nicht genug Platz. Da muss es sich verschieben. Mach es dir einfach, benutze Text::ASCIITable.

Code:
#!/usr/bin/perl

use strict;
use warnings;

use Text::ASCIITable;

my @days = ("Max Mustermann", "Max Mustermaaaann", "Max Mustermaaaaann", "Thursday", "Friday", "Saturday", "Sunday");
my $table = Text::ASCIITable->new();

$table->setCols('','','','','','','' );
$table->setOptions({ hide_HeadLine => 1, hide_HeadRow => 1
                   ,'hide_FirstLine' => 1,'hide_LastLine' => 1});


foreach (@days) {

  $table->addRow($_,$_,$_,$_,$_,$_,$_);

}

print $table
Ausgabe:

Code:
| Max Mustermann     | Max Mustermann     | Max Mustermann     | Max Mustermann     | Max Mustermann     | Max Mustermann     | Max Mustermann     |
| Max Mustermaaaann  | Max Mustermaaaann  | Max Mustermaaaann  | Max Mustermaaaann  | Max Mustermaaaann  | Max Mustermaaaann  | Max Mustermaaaann  |
| Max Mustermaaaaann | Max Mustermaaaaann | Max Mustermaaaaann | Max Mustermaaaaann | Max Mustermaaaaann | Max Mustermaaaaann | Max Mustermaaaaann |

HTH

Micha
 
Hi,

danke für den ASCIITable Tip - das kannte ich nicht. Klappt aber leider auch nicht wie gewünscht:

Code:
.------------------------------------------------------------------------------------.
|                                      CUSTOMER                                      |
+----+-------------------+------------------------+----------+-------------+---------+
| Id | Name              | Street                 | Zip Code | City        | Country |
+----+-------------------+------------------------+----------+-------------+---------+
| 1  | xxxxxxx xxxxxxx  | Pirckheimerstraße 129 |    90419 | Nürnberg   | DE      |
| 2  | xxx xxxxxxx xxxxx | Mariental 3            |    91278 | Pottenstein | DE      |
| 3  | xxxxxx xxxxxxxxx  | Rathsbergerstraße 28  |    91054 | Erlangen    | DE      |
'----+-------------------+------------------------+----------+-------------+---------'
 
danke für den ASCIITable Tip - das kannte ich nicht. Klappt aber leider auch nicht wie gewünscht:

Hier schon ;)

Code:
#!/usr/bin/perl

use strict;
use warnings;

use Text::ASCIITable;

my $table = Text::ASCIITable->new({ headingText => 'CUSTOMER' });

$table->setCols('ID','Name','Street','Zip Code','City','Country');

$table->addRow("1","xxxxxxx xxxxxxx","Pirckheimerstraße 129","90419","Nürnberg","DE");
$table->addRow("2","xxx xxxxxxx xxxxx","Mariental 3","91278","Pottenstein","DE");
$table->addRow("3","xxxxxx xxxxxxxxx","Rathsbergerstraße 28","91054","Erlangen","DE");

print $table;
pl.png


Wo führst du dein Script denn aus? Also was für ein Terminal? Welche Fonts werden in diesem Terminal benutzt?

Mir geht es um:

http://de.wikipedia.org/wiki/Nichtproportionale_Schriftart

HTH

Micha
 
Hi,

daran hab ich auch schon gedacht und habe xterm mit

xterm -font -*-fixed-medium-r-*-*-18-*-*-*-*-*-iso8859-*

gestartet. Ändert aber nichts an der Darstellung. Es scheint wirklich mit speziell dieser Tabelle zu tun zu haben, denn andere Tabellen lassen sich problemlos anzeigen:

Code:
mathias@x61t:~/src/accounting$ ./customer-list.pl 
.------------------------------------------------------------------------------------.
|                                      CUSTOMER                                      |
+----+-------------------+------------------------+----------+-------------+---------+
| Id | Name              | Street                 | Zip Code | City        | Country |
+----+-------------------+------------------------+----------+-------------+---------+
| 1  | XXXXXXX XXXXXXX  | Pirckheimerstraße 129 |    90419 | Nürnberg   | DE      |
| 2  | XXX XXXXXXX XXXXX | Mariental 3            |    91278 | Pottenstein | DE      |
| 3  | XXXXXX XXXXXXXXX  | Rathsbergerstraße 28  |    91054 | Erlangen    | DE      |
'----+-------------------+------------------------+----------+-------------+---------'
mathias@x61t:~/src/accounting$ ./invoice-list.pl 
.-----------------------------------------------------------.
|                          INVOICES                         |
+----+-----------+-------+----------+-------+-------+-------+
| Id | Number    | Date  | Customer | From  | To    | Tax   |
+----+-----------+-------+----------+-------+-------+-------+
| 1  | 2010-1    | test1 |        1 | test2 | test3 | test4 |
| 2  | 2010-2011 | test1 |        1 | test2 | test3 | test4 |
'----+-----------+-------+----------+-------+-------+-------'
mathias@x61t:~/src/accounting$

cu
serow
 
Es scheint wirklich mit speziell dieser Tabelle zu tun zu haben, denn andere Tabellen lassen sich problemlos anzeigen:

Hmm...vielleicht hast du irgendwelchen Schrott in deinen Variablen. Versuche mal:

Code:
sub clean_string {

  my $string = shift;
  
  $string =~ s/[^a-zA-Z0-9 ]//g;

  return $string;

}

$table->addRow(clean_string($data[0]),clean_string($data[1]),clean_string($data[2]),clean_string($data[3]),clean_string($data[4]),clean_string($data[5]));
HTH

Micha
 
leider auch kein Erfolg.

Hmm...kann doch nicht so schwer sein. ;)

Eine Idee noch:

Code:
[...]
use strict;
use warnings FATAL => 'all';
use DBI qw(:utils);
[...]

foreach $row (@$res)
{
          my @data = @$row;
          
          print $data[1] . ' -> ' . data_string_desc($data[1]) . "\n";
          print $data[2] . ' -> ' . data_string_desc($data[2]) . "\n";
          print $data[3] . ' -> ' . data_string_desc($data[3]) . "\n";
          print $data[4] . ' -> ' . data_string_desc($data[4]) . "\n";
          print $data[5] . ' -> ' . data_string_desc($data[5]) . "\n\n";


          $table->addRow($data[0],$data[1],$data[2],$data[3],$data[4],$data[5]);

[...]
Was ergibt das bei dir? Hier wo es funktioniert:

Code:
Max Mustermann -> UTF8 off, ASCII, 14 characters 14 bytes
Pirckheimerstraße 129 -> UTF8 off, non-ASCII, 21 characters 21 bytes
90419 -> UTF8 off, ASCII, 5 characters 5 bytes
Nürnberg -> UTF8 off, non-ASCII, 8 characters 8 bytes
DE -> UTF8 off, ASCII, 2 characters 2 bytes

Max Mustermaaaann -> UTF8 off, ASCII, 17 characters 17 bytes
Mariental 3 -> UTF8 off, ASCII, 11 characters 11 bytes
91278 -> UTF8 off, ASCII, 5 characters 5 bytes
Pottenstein -> UTF8 off, ASCII, 11 characters 11 bytes
DE -> UTF8 off, ASCII, 2 characters 2 bytes

Max Mustermaaaaann -> UTF8 off, ASCII, 18 characters 18 bytes
Rathsbergerstraße 28 -> UTF8 off, non-ASCII, 20 characters 20 bytes
91054 -> UTF8 off, ASCII, 5 characters 5 bytes
Erlangen -> UTF8 off, ASCII, 8 characters 8 bytes
DE -> UTF8 off, ASCII, 2 characters 2 bytes
HTH

//EDIT
Vergessen...

Du kannst dann gleich noch folgendes testen:

Code:
my $dbh = DBI->connect("dbi:SQLite:dbname=database.db", "", "", $dbargs);
$dbh->{sqlite_unicode} = 1;
[...]

Micha
 
Zuletzt bearbeitet:
Zurück
Oben