HP-User: Ich werd noch verrückt...

Beitrag lesen

Abend Forum

Vorab den Teilausschnitt meines Programmes, der für die Suche nach der Kundennumer dessen Ausgabe zuständig ist. Doubletten bei der KD-Nummer sind drin, um die Umlautproblematik auszugeben:

  
###################################################################  
SuchenKdNummer:  
###################################################################  
  
system("clear");  
print "+-----------------------------------------------------+ \n";  
print "| Einschlafzeit / Daten-Verwaltungs-Programm (EZ-DVP) | \n";  
print "+-----------------------------------------------------+ \n";  
print " \n";  
print ">> Kunden suchen nach KD-Nummer << \n";  
print " \n";  
print "Bitte gesuchte Kundennummer eingeben :";  
$kdnummer = <STDIN>;  
print " \n";  
chop($kdnummer);  
if ($kdnummer <= 999999 and $kdnummer >= 100100) {goto KdJump;}  
goto SuchenKdNummer;  
KdJump:  
%zuordnung=(  
           kunden => {  
           file => 'kunden.csv',  
           col_names   => ['kdnummer', 'kddatum', 'kdfirma', 'kdstrasse', 'kdhausnummer', 'kdplz', 'kdort', 'kdland', 'kdansprechpartner', 'kdtelefon', 'kdfax', 'kdemail'],  
           },  
           );  
# Verbindung aufbauen  
$dbh = DBI->connect("DBI:CSV:", undef, undef, {  
                                              # Zeilenseparator  
                                              csv_eol => "\x0A",  
                                              # Spaltenseparator:  
                                              csv_sep_char => ",",  
                                              # Verzeichnis mit den Dateien  
                                              f_dir => $Bin,  
                                              # Zuordnung Dateiname -> Tabelle  
                                              csv_tables => \%zuordnung,  
                                              # bei Fehlern immer sterben:  
                                              RaiseError => 1,  
                                              }  
                      ) or die($DBI::errstr);  
$sth=$dbh->prepare("SELECT * FROM kunden WHERE kdnummer LIKE '$kdnummer'");  
$sth->execute();  
  
$Text::Table::Tiny::COLUMN_SEPARATOR = '|';  
$Text::Table::Tiny::ROW_SEPARATOR = '-';  
$Text::Table::Tiny::CORNER_MARKER = '+';  
$Text::Table::Tiny::HEADER_ROW_SEPARATOR = '_';  
$Text::Table::Tiny::HEADER_CORNER_MARKER = '|';  
  
# Tabellentest  
  
$rows=[];  
push @$rows, [qw(kdnummer kddatum kdfirma kdstrasse kdhausnummer kdplz kdort kdland kdansprechpartner kdtelefon kdfax kdemail)];  
while(@row = $sth->fetchrow_array){  
                                  push @$rows, [@row];  
                                  }  
  
print Text::Table::Tiny::table(rows => $rows, header_row => 1);  
print " \n";  
  
print " \n";  
print "Datensatzsuche beendet! [ENTER] \n";  
$sth->finish();  
$dbh->disconnect();  
$decider = <STDIN>;  
goto HauptMenu;  
exit;  

Im Programmkopf hab ich "use Encode;" drin. Ich weiss auch prinzipiell, dass ich encode oder decode oder encoding brauche. Vom Ablauf ist es so:

Es gibt eine CSV-Datei in utf-8. Das Perlprogramm ist in utf-8 gespeichert. Das Perlprogramm schnappt sich über die DBD die Daten in der CSV-Datei und diese werden dann an das Tabellenhilfsprogramm "Text::Table::Tiny" weitergereicht.

So wie es aussieht, werden die CSV-Werte falsch codiert an das "Text::Table::Tiny"-Programm übergeben. Das wiederum berechnet aufgrund der längeren Bytezahl bei einem "ä" Zwei Stellen statt einer, und addiert infolge dessen zu viele Leerstellen dazu. Das bedeutet in der Tabelle ist der Output verschoben. Siehe hier:

+----------+----------+----------+---------------+--------------+-------+---------------+--------+-------------------+-----------+---------+--------------------+
| kdnummer | kddatum  | kdfirma  | kdstrasse     | kdhausnummer | kdplz | kdort         | kdland | kdansprechpartner | kdtelefon | kdfax   | kdemail            |
+----------+----------+----------+---------------+--------------+-------+---------------+--------+-------------------+-----------+---------+--------------------+
| 100100   | 20120917 | MaxTech  | Musterstrasse | 11           | 79576 | Weil am Rhein | D      | Herr Müller      | 123456    | 123456  | service@maxtech.de |
| 100100   | 20120917 | Testshop | Testweg       | 13           | 79618 | Rheinfelden   | D      | Frau Tester       | 123456    | 1234567 | test@tester.de     |
| 100100   | 20120917 | kjhkjh   | lkjlkj        | 45           | 78987 | ölkölk      | D      | Herr Lölle       | 321       | 654     | 654@mnbmn.de       |
+----------+----------+----------+---------------+--------------+-------+---------------+--------+-------------------+-----------+---------+--------------------+

Wo genau im Programm, werden die CSV-Daten an das Tabellenprogramm übermittelt?

Was bedeutet bei "push @$rows, [@row];" das "@$rows"? Ich dachte es gibt Skalare und Arrays - was soll das - ist das ein Zwitter?
(Diese Schreibweise ist mir in einem anderen Forum gezeigt worden)

Ich hoffe es ist klar, was ich erreichen will.

Gruss HP-User