Zum Inhalt springen

[Perl] dynamische sprintf-Formatierung bei Datenbankabfragen


Empfohlene Beiträge

Hi,

hab n skript geschrieben das werte aus ner db ließt und ausgiebt.

jetzt hab ich nur ein kleines problem, die einzelnen datensätze haben stark unterschiedliche längen (zwischen 4 und 40 zeichen).

da es eine konsolenausgabe ist, ist diese sehr unüberischtlich.

daher dachte ich dann, ich formatiere die strings mit sprintf.

das sieht wie folgt aus:


while( @row = $refcursor->fetchrow_array()){

 $retval = $retval . sprintf("%-20s = %${row_len}s %s\n", $row[1], $row[4], $row[0]);

}

Nun ist mir aber aufgefallen dass das so nicht geht. Denn ich brauch alle Datensätze aus der Abfrage, muss die länge aller $row[4] Werte vergleichen und mir den großten speichern und dann zur $row_len machen. Das sieht dann so aus

 while($x <= $row){    #$x ist die Zählervariable und 0

  if($row_len < length $row[4]){

   $row_len = length $row[4];

  }

 $x++;

 }

Nun frage ich mich allerdings wie ich die beiden Stücke miteinander verbinde das es auch funktioniert. Hab da mal rumgespielt, das sieht dann wie folgt aus:

while( @row = $refcursor->fetchrow_array()){

  if($row_len < length $row[4]){

   $row_len = length $row[4];

  }

 $retval = $retval . sprintf("%-20s = %${row_len}s %s\n", $row[1], $row[4], $row[0]);

}

Was aber auch nicht geht da der string ja immer gleich im Anschluss formatiert wird und somit die Länge so groß ist wie bis zu dem Zeitpunkt. kommt später was größeres juckt des die ersten Zeilen nich viel :(

Weiß da jemand ne bessere Lösung?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Thx für die Antwort, hab da schon etwas rumgetestet, letztendlich hat mir n Kollege geholfen, sieht nun so aus:


my $oraProc = "BEGIN pmisp_product_filldynattrib( $intart_id, $xfregid, \'$lang\',\'$lang\', $intstatussp, :x); END;";

		$sth = $dbh->prepare($oraProc);

		$sth->bind_param_inout( ":x", \$refcursor, 0, { ora_type => ORA_RSET } );

		$sth->execute;

		$sth->finish;


		$val_len = 0;


		while( @row = $refcursor->fetchrow_array()){

			my $attid = $row[1];

			my $attval = $row[4];

			my $attname = $row[0];

			my $vallen = length($attval);

			my $idlen  = length($attid);

			if($val_len < $vallen){

				$val_len = $vallen; #Bestimmen der maximalen Spaltenbreite

			}

			if($id_len < $idlen){

				$id_len = $idlen; #Bestimmen der maximalen Spaltenbreite

			}

			my @data = ($attid, $attval, $attname);

			push(@attribute, \@data);


		}#while( @row = $refcursor->fetchrow_array())


#Kontrollstrukturen...


foreach $data (@attribute) {

		my ($attid, $attval, $attname) = @$data;

		$retval = $retval . sprintf("%-${id_len}s  =  %-${val_len}s  (%s)\n", $attid, $attval, $attname);

#Festlegen der Spalten

	}#foreach my $data (@attribute)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...