HP-User: Inhaltswerte in String bearbeiten

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

  1. 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.

    1. 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

      1. Dein Problem ist, dass du deine Ausgabe nicht kodierst. Textausgabe mit print ohne Encodinglayer ist falsch.

        1. 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

          1. gudn tach!

            Was bedeutet bei "push @$rows, [@row];" das "@$rows"? Ich dachte es gibt Skalare und Arrays - was soll das - ist das ein Zwitter?

            referenz auf ein array.

            array:~~~perl

            my @row = ('kruemelmonster', 'bibo', 'kermit', 'elmo');

            @row ist hier ein array mit namen aus der sesamstrasse als elementen

            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

            1. 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:

              CodeAnleitung

              Gruss und Gute Nacht

              HP-User