Umwandeln einer Text-Datei in eine ASCII-Tabelle mit hängendem Einzug

Hier geht es darum, daß ein Log-File ansehnlicher dargestellt werden soll. Das Logfile hat das folgende Format

      04/25/02;Dies ist ein langer Text, der [...]
      04/24/02;Dies ist ein langer Text, der [...]
      04/23/02;Dies ist ein langer Text, der [...]
      [...]
    

Die Ausgabe per 'less' erzeugt dann folgendes:

      04/25/02;Dies ist ein langer Text, der
      nicht ganz in eine Zeile passen wird u
      nd deshalb bei der Bildschirmausgabe u
      mgebrochen wird.
      04/24/02;Dies ist ein langer Text, der
      nicht ganz in eine Zeile passen wird u
      nd deshalb bei der Bildschirmausgabe u
      mgebrochen wird.
      [...]
    

Die gewünschte Ausgabe ist jedoch:

      04/25/02     Dies ist ein langer Text, der nicht 
                   ganz in eine Zeile passen wird und 
                   deshalb bei der Bildschirmausgabe
                   umgebrochen wird.

      04/25/02     Dies ist ein langer Text, der nicht 
                   ganz in eine Zeile passen wird und 
                   deshalb bei der Bildschirmausgabe
                   umgebrochen wird.

      [...]
    

Script - Teil 1

 #!/usr/bin/perl

 print "\n1\. Geben Sie den Pfad zur umzuwandelnden Datei ein: ";
 my $file_name = <STDIN>;
 chomp $file_name;

 my $outfile_name = "$file_name\.Tabelle";

 open (INPUT, "<$file_name");
 my @file_content = <INPUT>;
 close (INPUT);

 my @titel;
 my @text; 

 foreach (@file_content)
 {
   my @lines = split(/;/,$_);
   push (@titel, $lines[0]);
   push (@text,  $lines[1]);
 }
    

In dem vorstehenden Script-Teil wird zunächt die Datei eingelesen, die in eine Tabelle umgewandelt werden soll. Die Zeilen der einzulesenden Datei muß das Format '<Titel>;<Text>' haben. Das Semikolon in der Zeile ist das Trennzeichen. Anhand dieses Trennzeichens wird die Funktion 'split()' die Zeile aufteilen und die beiden Felder 'Titel' und 'Text' werden in die entsprechenden Arrays (@titel und @text) eingetragen.

Script - Teil 2

 #
 # sucht den längsten Eintrag für die erste Spalte
 #

 my $col_a = 10;

 foreach (@titel)
 {
   if (length $_ > $col_a)
   {
     $col_a = length $_;
   }
 }
    

Im zweiten Teil des Scriptes wird die Breite der ersten Spalte der Ausgabedatei zunächst auf 10 Zeichen festgelegt. Wenn jedoch ein Eintrag aus '@titel' länger als 10 Zeichen ist, so wird diese Länge für die erste Spalte angenommen. (Anm.: Allerdings sollte man ggf. noch eine maximale Breite für die erste Spalte einbauen, da, wenn ein Eintrag in Titel z.B. 78 Zeichen lang ist für die zweite Spalte nur noch 1 Zeichen übrig bleibt).

Script - Teil 3

 #
 # erstellt die Tabelle
 #

 my $max_line_length = 80;
 my $col_b = $max_line_length - $col_a + 1;

 my $cnt = -1;

 open (OUTFILE, ">$outfile_name");
 foreach (@titel)
  {
    $cnt++;
    my $diff_length = $col_a  - (length $_);
    print OUTFILE ("$_ ");
    while ($diff_length > -1)
    {
      $diff_length--;
      print OUTFILE (" ");
    }

    if (length $text[$cnt] > $col_b)
    {
      my $diff_length = (length $text[$cnt]) - $col_b;
      my @col_b_line = split(/ /, $text[$cnt]);
      my $line_length = 0;

      foreach (@col_b_line)
      {
	$line_length = $line_length + 1 + (length $_);
	if ($line_length < $col_b)
	{
	  print OUTFILE ("$_ ");
        }
	else
	{
	  print OUTFILE "\n";

	  for (my $i = 0; $i < ($col_a +2 ); $i++)
	  {
	    print OUTFILE (" ");
	  }

	  print OUTFILE ("$_ ");
   	  $line_length = 0;
        }
      }
    }
    else
    {
      print OUTFILE ("$text[$cnt]");
    }

    print OUTFILE ("\n");

  }

 close (OUTFILE);
 print "2. Die Datei wurde unter \"$outfile_name\" gespeichert.\n";
 print "\n";
    

Dieser Teil des Scriptes ist nun der, welcher die Ausgabe strukturiert erzeugt. Im ersten Teil wurde die Datei eingelesen und in die beiden Spalten aufgeteilt. Im Zweiten Teil wurde die Spaltenbreite für die erste Spalte festgelegt. Im dritten Teil wird nun zunächt die Breite für die zweite Spalte errechnet, indem von der maximalen Abzeigebreite (hier 80 Zeichen -> $max_line_length) die Breite der ersten Spalte (+ 1 für einen Leerraum zwischen den Spalten) abgezogen wird.

Danach werden die Zeilen ausgegeben, indem jedes Array mittels eines Zählers ($cnt) angesprochen wird. Jeder Eintrag des Arrays '@text' wird wiederum durch 'split()' (mit einem Leerzeichen als Trennzeichen) ausgelesen und in ein neues Array zwischengelagert. Damit stehen in dem neuen Array '@col_b_line' die einzelnen Worte der Zeile. Für jede auszugebende Zeile werden nun die Zeichenlängen der Worte aus '@col_b_line' addiert. Nur wenn das Wort noch in die Zeile passt, wird es ausgegeben. Passt das Wort nicht mehr komplett in die Zeile, so wird ein Zeilenumbruch eingefügt, und die erste Spalte der neuen Zeile wird mit der entsprechenden Anzahl Leerzeichen gefüllt. Dadurch entsteht der 'hängende Einzug.

Wenn die Anzeigebreite des Bildschirms eine größere Anzahl Zeichen zuläßt, kann das Script darauf angepaßt werden, indem der Wert von '$max_line_length' statt auf 80 auf die gewünschte Zeichenbreite angepaßt wird.

Die Ausgabe der Datei erfolgt direkt wieder in eine Datei (<Originalname>.Tabelle)

Download

Das komplette Script zum Download: umbruch.pl


Martin Holz | Impressum

Valid HTML 4.01!