Inhaltswerte in String bearbeiten
HP-User
- perl
Morgen Forum
Mit dieser Perlzeile:
print Text::Table::Tiny::table(rows => $rows, header_row => 1);
print " \n";
Erhalte ich diese Daten im Terminal:
+----------+----------+----------+---------------+--------------+-------+---------------+--------+-------------------+-----------+---------+--------------------+| 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 |+----------+----------+----------+---------------+--------------+-------+---------------+--------+-------------------+-----------+---------+--------------------+ Datensatzsuche beendet! [ENTER]
Ich muss jetzt überprüfen, ob zwischen den "|" Strichen der enthaltene Text Umlaute enthält und wieviele. Für jeden gefundenen Umlaut, muss vor dem betreffendem Endstrich "|" ein Leerzeichen hinzugefügt werden "Space".
Prinzipiell ein Fall für RegEx. Aber RegEx kann soweit ich weiss, nur nach fix eingestelltem Muster suchen, aber nicht zählen. Ganz schön knifflige Angelegenheit.
print Text::Table::Tiny::table(rows => $rows(Hier müsste der Block hin, der Leerzeichen korrigiert), header_row => 1);
print " \n";
Gruß HP-User
Tach!
Ich muss jetzt überprüfen, ob zwischen den "|" Strichen der enthaltene Text Umlaute enthält und wieviele. Für jeden gefundenen Umlaut, muss vor dem betreffendem Endstrich "|" ein Leerzeichen hinzugefügt werden "Space".
Nein, das wäre der falsche Ansatz. Und der hört bei Umlauten nicht auf. Irgendwann bekommst du einen André, den du nicht berücksichtigt hast. Besser wäre es, wenn du zeichenorientiert arbeiten (lassen) würdest.
dedlfix.
Hi dedlfix
Nein, das wäre der falsche Ansatz. Und der hört bei Umlauten nicht auf. Irgendwann bekommst du einen André, den du nicht berücksichtigt hast. Besser wäre es, wenn du zeichenorientiert arbeiten (lassen) würdest.
Mist, das hab ich nicht bedacht. Du hast Recht. Dann muss ich schauen, ob ich dem Modul Text::Table::Tiny das irgendwie korrekt kodiert übergebe.
Gruss HP-User
Dein Problem ist, dass du deine Ausgabe nicht kodierst. Textausgabe mit print ohne Encodinglayer ist falsch.
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
gudn tach!
Was bedeutet bei "push @$rows, [@row];" das "@$rows"? Ich dachte es gibt Skalare und Arrays - was soll das - ist das ein Zwitter?
array:~~~perl
my @row = ('kruemelmonster', 'bibo', 'kermit', 'elmo');
print $row[1]; # gibt 'bibo' aus.
ref auf array:~~~perl
my $row = ['kruemelmonster', 'bibo', 'kermit', 'elmo'];
# $row ist hier eine referenz auf ein array mit namen aus der sesamstrasse als elementen
print $row->[1]; # gibt 'bibo' aus.
prost
seth
Hi seth
Das Referenz auf Referenz hab ich gelesen - Danke für den Link. Was allerdingd nicht heisst, dass ich alles verstanden habe.
Das Codierungsproblem hab ich beseitigt. Denkfehler war eine Wissenslücke, dass Perl Dateiin- und Outputs anders verarbeitet, als In- und Output von Tastatur.
Das hier ist ne gute Seite, wenn man was über Codierung lernen möchte:
Gruss und Gute Nacht
HP-User