Sequentielle Liste in Tabelle verwandeln

View: New views
9 Messages — Rating Filter:   Alert me  

Sequentielle Liste in Tabelle verwandeln

by Andre Tann-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hallo zusammen,

folgende Tabelle liegt mir vor:

Name
Straße
PLZ Ort
Tel: [Tel] < optionale Zeile
Fax: [Fax] < optionale Zeile
E-Mail: [E-Mail] < optionale Zeile
Internet: [URL] < optionale Zeile

Ein Adressdatensatz erstreckt sich also über mehrere Zeilen, und ist
vom nächsten durch eine Leerzeile getrennt.

Das will ich umwandeln in eine Tabelle mit einem Datensatz pro
Zeile, und eben sieben Spalten.

Das Problem dabei ist, daß die letzten vier Zeilen nur optional
vorkommen. Mal gibts nur ein Telefon, mal nur Fax und E-Mail, usw.
Die optionalen Zeilen beginnen aber immer mit dem Bezeichner, daran
erkennt man also, in welche Spalte die Daten gehören.

Gibts einen Weg, wie ich das leicht umgewandelt bekomme, irgend
einen awk- oder Perl-Hack oder so?

--
Andre Tann


--
Haeufig gestellte Fragen und Antworten (FAQ):
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: Sequentielle Liste in Tabelle verwandeln

by Heinz Diehl :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 30.10.2009, Andre Tann wrote:

> Das will ich umwandeln in eine Tabelle mit einem Datensatz pro
> Zeile, und eben sieben Spalten.

Wie soll das genau aussehen?


--
Haeufig gestellte Fragen und Antworten (FAQ):
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: Sequentielle Liste in Tabelle verwandeln

by Alexander Dahl-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Moin,

> Gibts einen Weg, wie ich das leicht umgewandelt bekomme, irgend
> einen awk- oder Perl-Hack oder so?

Also groß aufwändig sieht das nicht aus, aber ein kleines Skript musst
Du wohl schon schreiben. Ich würde in Perl in etwa wie folgt vorgehen:

 * Datei bis zum nächsten Absatz lesen und zwischenspeichern (array of
lines)
 * mit den ersten drei Zeilen entsprechende Felder in einem temporären
Hash füllen
 * in den optionalen Zeilen bei : splitten und den Teil davor als
Hash-Key für den selben Temp-Hash verwenden
 * mit einer Subroutine den Inhalt des Hashs in die neue Datei
rausschreiben getrennt mit ; oder wie Du willst

Würde ich jetzt nicht in einer Zeile zusammenfassen können oder wollen,
aber sollte schnell zu hacken sein.

Gruß
Alex

--
»With the first link, the chain is forged. The first speech censured,
the first thought forbidden, the first freedom denied, chains us all
irrevocably.« (Jean-Luc Picard, quoting Judge Aaron Satie)
*** GnuPG-FP: 02C8 A590 7FE5 CA5F 3601  D1D5 8FBA 7744 CC87 10D0 ***



signature.asc (267 bytes) Download Attachment

Re: Sequentielle Liste in Tabelle verwandeln

by Andre Tann-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Heinz Diehl, Freitag 30 Oktober 2009:
> On 30.10.2009, Andre Tann wrote:
> > Das will ich umwandeln in eine Tabelle mit einem Datensatz pro
> > Zeile, und eben sieben Spalten.
>
> Wie soll das genau aussehen?

Vereinfacht:

Name Str. Ort Tel Fax Mail
============================================
Name1 Str1 Ort1 Fax1
Name2 Str2 Ort2 Mail2
Name3 Str3 Ort3 Tel3 Fax3 Mail3

usw.

Die Zuordnung der Spaltenzugehörigkeit von Tel, Fax und Mail muß
eben aufgrund der Präfixe Tel:, Fax: und Mail: erfolgen.

Name, Str. und Ort haben diese Präfixe nicht, und kommen immer vor.

--
Andre Tann


--
Haeufig gestellte Fragen und Antworten (FAQ):
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: Sequentielle Liste in Tabelle verwandeln

by Uwe Kerstan :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

* Andre Tann [30-10-2009 12:07]:

> > Wie soll das genau aussehen?
>
> Vereinfacht:
>
> Name Str. Ort Tel Fax Mail
> ============================================
> Name1 Str1 Ort1 Fax1
> Name2 Str2 Ort2 Mail2
> Name3 Str3 Ort3 Tel3 Fax3 Mail3

Das ist mal ein Ansatz:

#!/usr/bin/perl
my %h = ();
my $i = 1;
while (<>) {
    chomp;
    if ( $i > 0 && $i < 4 ) {
        $h{$i} = $_;
    } else {
        if ( /(.*):\s(.*)/ ) { $h{$1} = $2; }
    }
    $i++;
    if ( /^$/ ) {
        print "$h{'1'} $h{'2'} $h{'3'} $h{'Tel'} $h{'Fax'} $h{'Internet'}\n";
        $i = 1;
        %hash = ();
    }
}
# eof

Schön machen musst du es alleine. :-)

Gruß Uwe


signature.asc (204 bytes) Download Attachment

Re: Sequentielle Liste in Tabelle verwandeln

by Uwe Kerstan :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

* Uwe Kerstan [30-10-2009 14:29]:

> print "$h{'1'} $h{'2'} $h{'3'} $h{'Tel'} $h{'Fax'} $h{'Internet'}\n";

$h{'E-Mail'} hatte ich noch vergessen.

Gruß Uwe


signature.asc (204 bytes) Download Attachment

Re: Sequentielle Liste in Tabelle verwandeln

by Uwe Kerstan :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

* Uwe Kerstan [30-10-2009 14:29]:

> if ( $i > 0 && $i < 4 ) {

Da reicht auch ($i < 4) na ja, egal. :-)


signature.asc (204 bytes) Download Attachment

Re: Sequentielle Liste in Tabelle verwandeln

by Christian Brabandt :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hallo Andre!

Andre Tann schrieb am Freitag, den 30. Oktober 2009:

> Heinz Diehl, Freitag 30 Oktober 2009:
> > On 30.10.2009, Andre Tann wrote:
> > > Das will ich umwandeln in eine Tabelle mit einem Datensatz pro
> > > Zeile, und eben sieben Spalten.
> >
> > Wie soll das genau aussehen?
>
> Vereinfacht:
>
> Name Str. Ort Tel Fax Mail
> ============================================
> Name1 Str1 Ort1 Fax1
> Name2 Str2 Ort2 Mail2
> Name3 Str3 Ort3 Tel3 Fax3 Mail3

Perl hatten wir ja schon. Hier die awk Version:

#v+
#!/usr/bin/awk -f
BEGIN {
    printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n","Name","Str.","Ort","Tel","Fax","Mail","Internet");
    printf("==========================================================================================\n");
}
/./ {a[$1] = $2; }
!/./ {
   printf("%-10.10s\t%-10.10s\t%-10.10s\t%-10.10s\t%-10.10s\t%-10.10s\t%-10.10s\n", a["Name"], a["Straße"], a["PLZ"], a["Tel:"], a["Fax:"], a["E-Mail:"], a["Internet:"]);
   delete(a);
   }
~$
#v-


Grüße
Christian
--
  • If you need more than 3 levels of indentation, you're screwed anyway, and
    should fix your program.
       Linus Torvalds: Linux 1.3.53 CodingStyle documentation.


--
Haeufig gestellte Fragen und Antworten (FAQ):
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: Sequentielle Liste in Tabelle verwandeln

by Heiko Schlittermann :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hallo Andre,


Andre Tann <atann@...> (Fr 30 Okt 2009 11:56:25 CET):

> Hallo zusammen,
>
> folgende Tabelle liegt mir vor:
>
> Name
> Straße
> PLZ Ort
> Tel: [Tel]                    < optionale Zeile
> Fax: [Fax]            < optionale Zeile
> E-Mail: [E-Mail]              < optionale Zeile
> Internet: [URL]               < optionale Zeile
>
> Ein Adressdatensatz erstreckt sich also über mehrere Zeilen, und ist
> vom nächsten durch eine Leerzeile getrennt.
(…)
>
> Gibts einen Weg, wie ich das leicht umgewandelt bekomme, irgend
> einen awk- oder Perl-Hack oder so?

Auch wenn Perl natürlich schon in einer der Antworten vorkam, ich kann's
mir trotzdem nicht verkneifen, eine weitere der möglichen Perl-Lösungen
zu schreiben. Insbesondere schreibe ich diese Lösung, weil Sie

a) die Fähigkeit Perls nutzt, einen ganzen Absatz als einen Datensatz zu
betrachen

b) Perls Fähigkeit zur formatierten Ausgabe

    #! /usr/bin/perl

    use strict;
    use warnings;
    use Data::Dumper;

    my %record;
    format STDOUT_TOP =
    NAME       Strasse   ADDR      TEL       FAX       MAIL      URL
    ----------+---------+---------+---------+---------+---------+---------
    .
    format STDOUT =
    @<<<<<<<<< @<<<<<<<< @<<<<<<<< @>>>>>>>> @>>>>>>>> @<<<<<<<< @<<<<<<<<
    @{record}{qw/name strasse addr tel fax mail url/}
    .

    # input record separator is an empty line
    $/ = "";

    while (<>) {

        # strip trailing whitespace
        s/\s+\n/\n/mg;

        /^(?<name>.*)\n
          (?<strasse>.*)\n
          (?<addr>.*)\n
          (?:tel:\s+(?<tel>.*)\n)?
          (?:fax:\s+(?<fax>.*)\n)?
          (?:e-mail:\s+(?<mail>.*)\n)?
          (?:internet:\s+(?<url>.*)\n)?
        /ix;

        # fill missing records
        %record =
            (tel => "",
             fax => "",
             mail => "",
             url => "", %+);

        # … it's up to you to do anything useful here
        #    print Dumper \%record;
        #    write;

    }


    Best regards from Dresden/Germany
    Viele Grüße aus Dresden
    Heiko Schlittermann
--
 SCHLITTERMANN.de ---------------------------- internet & unix support -
 Heiko Schlittermann HS12-RIPE -----------------------------------------
 gnupg encrypted messages are welcome - key ID: 48D0359B ---------------
 gnupg fingerprint: 3061 CFBF 2D88 F034 E8D2  7E92 EE4E AC98 48D0 359B -


signature.asc (204 bytes) Download Attachment