Schrift
[thread]12083[/thread]

Formatierte Ausgabe / Platzhalter ... aber wie ? (Seite 2)

Leser: 19


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
cherished
 2008-06-26 13:00
#111541 #111541
User since
2008-06-18
31 Artikel
BenutzerIn
[default_avatar]
Super und so jetzt =)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
ID:                  10_01 
Vorgangsart: 23 Korrekt
Landesdirekt: 22364 Korrekt
VNR: Leer
Schadensjahr: 123 Korrekt
__________________________________________________________________

ID: 10_02
Vorgangsart: 24 Korrekt
Landesdirekt: 22366 Falsch (29866)
VNR: 29866 Falsch (123)
Schadensjahr: 123 Korrekt
__________________________________________________________________
Linuxer
 2008-06-26 13:01
#111542 #111542
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Hi,

nochmal als Denkansatz:

folgender Code:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;

my %data = (
    ID           => [ qw( 10_04 ) ],
    Vorgangsart  => [ qw( 27 korrekt) ],
    Landesdirekt => [ qw( 22367 korrekt) ],
    VNR          => [ qw( 29868 korrekt) ],
    Schadensjahr => [ qw( 123 korrekt) ],
);


for my $k ( keys %data ) {

    my $format = "%-15s %10s %10s\n";
    if ( $k eq 'ID' ) {
        $format = "%-15s %10s\n";
    }
    printf $format, "$k:", $data{$k}->[0], $data{$k}->[1];
}


liefert folgende Ausgabe:

Code: (dl )
1
2
3
4
5
ID:                  10_04
Vorgangsart: 27 korrekt
Landesdirekt: 22367 korrekt
Schadensjahr: 123 korrekt
VNR: 29868 korrekt
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast lalalu
 2020-06-01 13:35
#191872 #191872
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
print _stringFormat('12345', 10) ;
print _stringFormat('huhu longlongbimbambuhh', 15);
print _stringFormat('bimbam'), 20) . "\n";
print _stringFormat('123', 10) ;
print _stringFormat('huhu', 15);
print _stringFormat('bimbam'), 20) . "\n";

sub _stringFormat {
    my $c = ($_[1] - length($_[0])) < 0 ? 0 : $_[1] - length($_[0]);
    $_[0] = substr($_[0], 0, $_[1]-4) . "... " if (length($_[0]) >= $_[1]);
    return $_[0] . " " x $c;
}   

Last edited: 2020-06-01 14:02:35 +0200 (CEST)
alzach
 2021-09-30 23:10
#193614 #193614
User since
2021-09-30
4 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe (fast) das gleiche Problem.
ich habe mir aus dem Netz ein kostenloses Script für einen Onlineshop runtergeladen und auf meine Bedürfnisse zugeschnitten.
Trotz meiner fehlenden Kenntnisse in Perl funktioniert auch alles ganz gut.
Das Problem ist zwar nur der Schönheit geschuldet, sollte aber auch behoben werden.
Das Script übernimmt Felder aus einem Online-Shop und schreibt sie in ein Email, wo dann ein Artikel (Menge, ID, Bezeichnung, Preis, sonstiges) pro Zeile aufgelistet wird. Da die Bezeichnungen unterschiedlich lang sind, erscheinen die Preise nicht untereinander, sondern werden einfach an die Beschreibung angehängt.
So sieht im wesentlichen der betreffende Code aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   # Send email order to you...
open (MAIL,"|$mailprogram");
print MAIL "To: $youremail\n";
print MAIL "From: $b_email\n";
print MAIL "Subject: Online Bestellung\n";
print MAIL "\n\n";
print MAIL "Online Bestellung.\n";
print MAIL "\n";
print MAIL "Bestelldatum: $day. $months[$month] $year $hour:$min:$sec \n";
print MAIL " \n";
print MAIL "Rechnungsanschrift: \n";
print MAIL "-------- \n";
print MAIL " $b_first $b_last \n";
print MAIL " $b_addr \n";
print MAIL " $b_addr2 \n";
print MAIL " $b_zip $b_city \n";
print MAIL " $b_phone \n";
print MAIL " $b_fax \n";
print MAIL " $b_email \n";
print MAIL " \n";
print MAIL " \n";
print MAIL "Menge Produkt Name - Preis(Euro)\n";
print MAIL "===================================================================== \n";
print MAIL "$QUANTITY_1 $ID_1 - $NAME_1 Euro $PRICE_1 $ADDTLINFO_1 \n";
if( $NAME_2 ) {print MAIL "$QUANTITY_2 $ID_2 - $NAME_2 Euro $PRICE_2 $ADDTLINFO_2 \n";}
if( $NAME_3 ) {print MAIL "$QUANTITY_3 $ID_3 - $NAME_3 Euro $PRICE_3 $ADDTLINFO_3 \n";}
if( $NAME_4 ) {print MAIL "$QUANTITY_4 $ID_4 - $NAME_4 Euro $PRICE_4 $ADDTLINFO_4 \n";}
if( $NAME_5 ) {print MAIL "$QUANTITY_5 $ID_5 - $NAME_5 Euro $PRICE_5 $ADDTLINFO_5 \n";}
if( $NAME_6 ) {print MAIL "$QUANTITY_6 $ID_6 - $NAME_6 Euro $PRICE_6 $ADDTLINFO_6 \n";}

Leider reichen meine bescheidenen Kenntnisse nur aus, um den vorhandenen Code halbwegs zu verstehen und etwas anpassen zu können.
Was müsste ich also ggf. ändern/erweitern, um eine halbwegs tabellarische Darstellung zu bekommen?
Last edited: 2021-10-01 08:31:37 +0200 (CEST)
GwenDragon
 2021-10-01 23:43
#193615 #193615
User since
2005-01-17
14532 Artikel
Admin1
[Homepage]
user image
@Alzach Willkommen in unserem Perl-Forum. :-)

Nun zu deiner Frage.

Es wäre möglich Reports mit Perls Format-Feature zu machen. Aber das ist manchmal fisselich.
Schau https://www.tutorialspoint.com/perl/perl_format.ht...

Ansonsten gibt es Module auf CPAN wie:
Text::SimpleTable
Text::Table
Data::Table::Text

Oder kannst du Module nicht benutzen/installieren?

Ich würde gern mehr schreiben, aber es ist schon spät. Morgen werde ich dir weiter helfen können.
Last edited: 2021-10-01 23:46:06 +0200 (CEST)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

alzach
 2021-10-03 18:34
#193616 #193616
User since
2021-09-30
4 Artikel
BenutzerIn
[default_avatar]
Hallo GwenDragon,
erst mal vielen Dank für die schnelle Rückmeldung.
Das mit den Modulen wird wohl eher nix bei mir.
Mit dem Perl Format-Feature habe ich mich schon mal etwas halbherzig beschäftigt, weil es mir als eine einfache Lösung erschien. Allerdings gibt es da noch sehr viele offene Fragen, die bei der Umsetzung auftauchen.
Wie du siehst ist der von mir benutzte Code ja zunächst auf print-Befehle ausgelegt, die zudem noch unterschiedliche Darstellungsformen erzeugen. Da sind einmal die Anschriftsfelder, die untereinander geschrieben werden und danach kommen die Listenfelder, bei denen zwar für jeden Artikel die Felder nebeneinander geschrieben werden, aber halt ohne eine Spaltenangleichung.
In dem von dir genannten Link ist mir zwar das "format employee" halbwegs verständlich, aber da ist dann von "write" die Rede und von einem geöffneten Dateihandle (ich nehme an, das entspricht dem "open (Mail...) in meinem Code. Kann ich diesen format-Befehl mit print auch nutzen? Kann ich den einfach nach den Anschriftsfeldern einsetzen? Muss am Anfang des Codes vielleicht noch irgendetwas gesetzt werden?
Diese und ähnliche Fragen konnte ich bisher keiner Beschreibung explizit entnehmen und beim Ausprobieren habe ich immer das Gefühl, ich hätte zwar alles richtig, nur irgendwo einen Punkt oder ein Sonderzeichen oder sonstwas vergessen.
hlubenow
 2021-10-03 22:45
#193617 #193617
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Zum Experimentieren wäre es gut, das Ergebnis erstmal auf der Konsole auszugeben. Das ginge so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/perl

use warnings;
use strict;

my $youremail = "you\@email.de";
my $b_email   = "me\@email.de";

my $day = 3;
my @months = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);
my $month = 9;
my $year = 2021;
my $hour = 14;
my $min = 10;
my $sec = 50;

my $b_first = "Max";
my $b_last  = "Mustermann";
my $b_addr  = "";
my $b_addr2 = "Mustergasse 15";
my $b_zip   = 54321;
my $b_city  = "München";
my $b_phone = "01234/5678";
my $b_fax   = "01234/56710";

my $QUANTITY_1 = 10;
my $QUANTITY_2 = 10;
my $QUANTITY_3 = 10;
my $QUANTITY_4 = 10;
my $QUANTITY_5 = 10;
my $QUANTITY_6 = 10;

my $ID_1 = 12345;
my $ID_2 = 12345;
my $ID_3 = 12345;
my $ID_4 = 12345;
my $ID_5 = 12345;
my $ID_6 = 12345;

my $NAME_1 = "Mustermann";
my $NAME_2 = "Mustermann";
my $NAME_3 = "Mustermann";
my $NAME_4 = "Mustermann";
my $NAME_5 = "Mustermann";
my $NAME_6 = "Mustermann";

my $PRICE_1 = 25;
my $PRICE_2 = 25;
my $PRICE_3 = 25;
my $PRICE_4 = 25;
my $PRICE_5 = 25;
my $PRICE_6 = 25;


my $ADDTLINFO_1 = "Angebot";
my $ADDTLINFO_2 = "Angebot";
my $ADDTLINFO_3 = "Angebot";
my $ADDTLINFO_4 = "Angebot";
my $ADDTLINFO_5 = "Angebot";
my $ADDTLINFO_6 = "Angebot";

print "To: $youremail\n";
print "From: $b_email\n";   
print "Subject: Online Bestellung\n";
print "\n\n";
print "Online Bestellung.\n";
print "\n";
print "Bestelldatum:  $day. $months[$month] $year $hour:$min:$sec \n"; 
print " \n";
print "Rechnungsanschrift: \n";
print "-------- \n";
print "   $b_first $b_last \n";
print "   $b_addr \n";
print "   $b_addr2 \n";
print "   $b_zip $b_city  \n";
print "   $b_phone \n";
print "   $b_fax \n";
print "   $b_email \n";
print " \n";
print " \n";
print "Menge  Produkt Name    -    Preis(Euro)\n";
print "===================================================================== \n";
print "$QUANTITY_1  $ID_1 - $NAME_1  Euro $PRICE_1       $ADDTLINFO_1  \n";
if( $NAME_2 ) {
    print "$QUANTITY_2 $ID_2 - $NAME_2   Euro $PRICE_2       $ADDTLINFO_2  \n";
}
if( $NAME_3 ) {
    print "$QUANTITY_3 $ID_3 - $NAME_3   Euro $PRICE_3       $ADDTLINFO_3  \n";
}
if( $NAME_4 ) {
    print "$QUANTITY_4 $ID_4 - $NAME_4   Euro $PRICE_4       $ADDTLINFO_4  \n";
}
if( $NAME_5 ) {
    print "$QUANTITY_5 $ID_5 - $NAME_5   Euro $PRICE_5       $ADDTLINFO_5  \n";
}
if( $NAME_6 ) {
    print "$QUANTITY_6 $ID_6 - $NAME_6   Euro $PRICE_6       $ADDTLINFO_6  \n";
}

Sehr ungünstig ist dieses "$QUANTITY_1", "$QUANTITY_2", usw.
Besser wäre, wenn das ein Array wäre, und man dann also
"$QUANTITIES[0]", "$QUANTITIES[1]", "$QUANTITIES[2]" hätte.
Aber ich schätze mal, die Variablen werden so in der ersten Variante aus Deinem Programm kommen.
alzach
 2021-10-04 23:04
#193618 #193618
User since
2021-09-30
4 Artikel
BenutzerIn
[default_avatar]
Hallo hlubenow,
auch dir ein herzliches Dankeschön für deinen Hilfeversuch.
Ich bin mir allerdings nicht sicher, ob ich das jetzt richtig verstehe.
Zum Experimentieren muss ich eigentlich nicht auf der Konsole arbeiten, da ich Perl nur über den Server meines Providers nutzen kann. Außerdem habe ich mehrere Test-Mailaccounts zur Verfügung, um mir die Mails selbst zuschicken zu können. Oder krieg ich damit ein Log, aus dem ich den/die Fehler ersehen kann und auch gleich einen möglichen Verbesserungsvorschlag bekomme?
Ich habe zu dem Thema ja schon intensiv gegoogelt, finde aber immer nur Teillösungen, die zwar die grundsätzlichen Befehle/Anweisungen für eine Tabellenformatierung wie "Employee" erklären, aber nicht, worauf man dabei besonders achten muss. Zumindest verstehe ich es da nicht.
Ich denke, mir wäre mit einem kleinen, kompletten Beispielscript mehr geholfen.
hlubenow
 2021-10-05 01:00
#193619 #193619
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
2021-10-04T21:04:35 alzach
Zum Experimentieren muss ich eigentlich nicht auf der Konsole arbeiten, da ich Perl nur über den Server meines Providers nutzen kann. Außerdem habe ich mehrere Test-Mailaccounts zur Verfügung, um mir die Mails selbst zuschicken zu können.

Du kannst Perl nicht nur über den Server Deines Providers nutzen, weil der Perl-Interpreter kostenlos heruntergeladen werden kann und dann auch auf der Konsole verwendet werden kann. Wenn Du Linux nutzt, hast Du ihn wahrscheinlich auf Deinem System und kannst ihn schon auf der Konsole benutzen.
Ich würde da so rangehen, daß der erste Schritt wäre, die gewünschte Formatierung lokal auf der Konsole hinzubekommen.
Danach fügt man das Ergebnis so ein, daß es auch mit
Code (perl): (dl )
print MAIL "...";

geht, das sendet den String nämlich anstatt auf die Konsole an ein Mail-Programm.
Die Frage ist jetzt also:
Wie sollen Deine Zeilen denn nun formatiert werden?
Also, 1. Spalte rechtbündig mit wieviel Zeichen,
2. Spalte rechtbündig mit wieviel Zeichen, usw?
Dann kann man sicher eine kleine Funktion schreiben, die das auch ohne Module so hinformatiert.
Und von Da wie gesagt zu Deinem Code mit dem Mail-Programm.

Das ist hier übrigens kein Support. Es geht mir nicht darum, Dein Problem zu lösen. Es ist für mich nicht von Bedeutung, ob das bei Dir nachher läuft oder nicht. Ich rede nur gern allgemein über Datenverarbeitung in Perl, das ist alles. Also, es kann klappen, muß aber nicht. Alles nur rein experimentell. Keine Haftung. Keine Ansprüche.
Wenn Du lieber gern eine andere Gesprächsgrundlage hättest, gäbe es sicherlich die Möglichkeit, jemanden wegen des Problems zu beauftragen.
Last edited: 2021-10-05 01:15:16 +0200 (CEST)
alzach
 2021-10-05 10:23
#193620 #193620
User since
2021-09-30
4 Artikel
BenutzerIn
[default_avatar]
@hlubenow
nun ja, ich arbeite mit W10 und möchte den Perl-Interpreter nicht unbedingt installieren, da ich ihn ohnehin nicht oft benötige, aber mit dem experimentieren auf der Konsole hast du natürlich grundsätzlich recht.
Was das Formatieren der Felder anbetrifft, habe ich natürlich schon versucht, mit "format employee" und "@<<<" usw. etwas zu formatieren, aber da scheint noch einiges zu fehlen.
Also meine Zeilen sollen wie folgt formatiert werden:
$QUANTITY_1 = dreistellig rechtsbündig
$ID_1 = vierstellig rechtsbündig
$NAME_1 = vierzigstellig linksbündig
$PRICE_1 = dreistellig mit zwei Nachkommastellen rechtsbündig
Euro = Euro wie geschrieben
$ADDTLINFO_1= zwanzigstellig rechtsbündig

Ich bin mir im klaren darüber, dass ein Lösungsvorschlag aus diesem Forum keinerlei Ansprüche nach sich ziehen kann aber hoffentlich sehr hilfreich sein wird ;-)
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2008-06-26 11:29.