perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 21
Click for quality!




11.02.2012 / 20:02

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  CGI: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragProblem beim Loop || LOOP mal anders
Seitenanfang
hallo,
ich habe eine Datei, die ich einlese.
Sie sieht wie folgt aus:
_________________________________
GruppeA|name
GruppeA|name1
GruppeB|name3|name2
GruppeC|name3
GruppeD|name1|name2|name3
usw.....
__________________________________
In worten heist das etwa: Es gibt verschiende Gruppe wo verschiende Namen zugehören.Es ist aber auch möglich dass 2 (oder mehr)Namen mal in unterschiedlichen Gruppen sind.

Ich wollte die zusammengehorigkeit der Gruppen und der dazugehörigen Namen etwas übersichtlicher gestalten.Dazu wollte ich Perl und CGI verwenden.
Ich hatte mir ein konstrukt aus Arays of hashes zusammen gebaut.Es sah ca so aus:
________________________________
#Dateinlesen
#Splitten
%test ('Gruppe' =>$gruppe,
'Name' =>$name
);
push (@test, %test);
________________________________
Das habe ich für jede Zeile der einzulesende Datei so gemacht und sie mit LOOP ausgeben.Das Ergebniss war leider , dass ich alle Gruppe so wie sie schon in der Datei standen auch wieder auf der html seite ausgegeben habe.

Meine Frage wäre, wie kann ich es bewerkstelligen, dass alle Namen einer Gruppe hinter der Gruppe selbst stehen und nicht mehr in verschienden Reihen?

Sollte ich mich an manchen Stellen nicht klar genug ausgedürckt haben, einfach nachfragen

Datum: 23.03.2007-15:35

Beitragre: Problem beim Loop || LOOP mal anders
Seitenanfang

use strict;
use warnings;

use Data::Dumper;

my %groups;

while(my $line = <DATA>) {
chomp($line);

# ueberspringe Leerzeilen
next if $line =~ /^\s*$/;

my($group, @names) = split '\|', $line;

# neues Gruppenarray falls noch keins vorhanden ist
my $tmp = ($groups{$group} ||= []);

# Namen ins Gruppenarray pushen
push(@{$tmp}, @names);
}

foreach my $group (keys %groups) {
printf("GRUPPE: %s\tNAMEN: %s\n",
$group, join(', ', @{$groups{$group}}));
}

print '-'x80, "\n";
print Dumper \%groups;

__END__
GruppeA|name
GruppeA|name1
GruppeB|name3|name2
GruppeC|name3
GruppeD|name1|name2|name3

Datum: 23.03.2007-16:34

Beitragre: Problem beim Loop || LOOP mal anders
Seitenanfang
vielen Dank

für deine schnelle und kompetene Hilfe!!!

Vielen Dank

Datum: 23.03.2007-16:46

Beitragre: Problem beim Loop || LOOP mal anders
Seitenanfang
hat jemand einen Idee wie ich die Daten jetzt in einer Lopp schleife ausgeben kann?
Weil die Lopp schleife frist ja nur array of hases und nicht andesherum ......

Datum: 23.03.2007-18:19

Beitragre: Problem beim Loop || LOOP mal anders
Seitenanfang
Keine Ahnung was genau du jetzt meinst, aber das einzige wo in meinen Code noch eine Loop denkbar waere...

foreach my $group (keys %groups) {
print "GRUPPE: $group\tNAMEN: ";

foreach my $name (@{$groups{$group}}) {
print "$name, ";
}

print "\n";
}


Ansonsten bitte etwas konkreter werden ;o)

Datum: 23.03.2007-19:29

Beitragre: Problem beim Loop || LOOP mal anders
Seitenanfang
Nabend,

ich habe mir das so gedacht: wenn ich alle Gruppen mit den dazugehörigen Namen habe, wollte ich diese auf einer Htmlseite ausgeben
das sähe dann undgefähr so aus :
_____________________________________________-
In GruppeA sind folgende Leute enthalten :|name,name1 usw.
In Gruppe B sind folgende Leute enthalten:Name2,Name3
____________________________________________

Ich hoffe es ist klar geworden wenn nicht bitte bescheid sagen

Datum: 23.03.2007-20:09

Beitragre: Problem beim Loop || LOOP mal anders
Seitenanfang
Genau das machen doch beide Codestücke von oben, oder nicht?
Der Hash %groups hat als Schlüssel die Gruppennamen, die Werte sind anonyme Arrays welche die Namen enthalten.
Das heißt die Gruppen sind separiert und die Namen jeweils den Gruppen zugeordnet.

Ich hab den obigen Code einmal etwas erweitert um die Ausgabe in eine HTML-Tabelle zu machen in der jede Gruppe mit den dazugehörigen Namen in einer Zeile ausgegeben wird.


#!/usr/bin/perl

use strict;
use warnings;

my %groups;

my $max_names_in_group = 0; # max. Anzahl von Namen in einer Gruppe

while(my $line = <DATA>) {
chomp($line);
next if $line =~ /^\s*$/;

my($group, @names) = split '\|', $line;

# speichert die max. Anzahl von Namen in einer Gruppe
$max_names_in_group = @names
if $max_names_in_group < @names;

# neues Gruppenarray falls noch keins vorhanden ist
my $tmp = ($groups{$group} ||= []);

# Namen ins Gruppenarray pushen
push(@{$tmp}, @names);
}

print qq{<html>\n<body>\n<table border="1">\n};

print "<tr>\n";

print "<th>Gruppen</th>\n";
print qq{<th colspan="$max_names_in_group">Namen in Gruppe</th>\n};

print "</tr>\n";

foreach my $group (keys %groups) {
print "<tr>\n";

print "<td>$group</td>\n";

foreach my $name (@{ $groups{$group} }) {
print "<td>$name</td>\n";
}

my $colspan = ($max_names_in_group - @{$groups{$group}});

print qq{<td colspan="$colspan"> </td>\n}
if $colspan;

print "</tr>\n";
}

print "</table>\n</body>\n</html>\n";

__END__
GruppeA|name
GruppeA|name1
GruppeB|name3|name2
GruppeC|name3
GruppeD|name1|name2|name3


Es war notwendig eine weitere globale Variable hinzuzufügen, die die maximale Anzahl von Leuten in einer Gruppe zählt. Daraus lässt sich die Tabellenbreite (Spaltenanzahl) bestimmen.

Datum: 23.03.2007-22:22

Beitragre: Problem beim Loop || LOOP mal anders
Seitenanfang
hallo,

ich war wohl ein bisschen überarbeitet.

Du hast natürlich recht was du sagst.
Es war quasi fertig nur ich habe es nicht als das erkannt :-)

Vielen dank für deine Hilfe!

Datum: 28.03.2007-16:37

-






-
-