|
View:
New views
9 Messages
—
Rating Filter:
Alert me
|
|
|
Sequentielle Liste in Tabelle verwandelnHallo 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 verwandelnOn 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 verwandelnMoin,
> 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 *** |
|
|
Re: Sequentielle Liste in Tabelle verwandelnHeinz 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* 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 |
|
|
Re: Sequentielle Liste in Tabelle verwandeln* 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 |
|
|
Re: Sequentielle Liste in Tabelle verwandeln* Uwe Kerstan [30-10-2009 14:29]:
> if ( $i > 0 && $i < 4 ) { Da reicht auch ($i < 4) na ja, egal. :-) |
|
|
Re: Sequentielle Liste in Tabelle verwandelnHallo 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 verwandelnHallo 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 - |
| Free embeddable forum powered by Nabble | Forum Help |