Schrift
[thread]5896[/thread]

Gruppenverarbeitung



<< >> 9 Einträge, 1 Seite
Gast Gast
 2003-11-11 17:05
#71169 #71169
Hallo,

ich hab folgendes Problem:
Ich habe einen Array der so aufgebaut ist:
@array = qw(Tabelle1.Spalte1 Tabelle1.Spalte2 Tabelle1.Spalte3 Tabelle2.Spalte1 Tabelle2.Spalte2 Tabelle2.Spalte3 Tabelle3.Spalte1)

Und so splitte ich den Array auf:
for ($zaehler = 0; $zaehler < @array; $zaehler++)
{
@item = split(/\./, $array[$zaehler]);
}

Jetzt möchte ich eine Gruppenverarbeitung machen, die mir alle Spalten, die zur gleichen Tabelle gehören
wieder in einen anderen Array speichert (mit der dazugehörigen Tabelle).
Das Ergebnis soll irgendwie so aussehen:
@array1 = (Tabelle1Spalte1Spalte2Spalte3)
--> Tabelle1 -> Element 0, Spalte1 -> Element 1, usw.

Der Grund ist folgender:
Ich möchte dann einen Select auf eine DB machen der folgendermassen aussieht:
select "Spalten" from "(z.B.)Tabelle1";

Ist das möglich?

Vielen Dank im Voraus für die Hilfe!

MfG,

Markus
Crian
 2003-11-11 17:28
#71170 #71170
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Klar, ich würd daraus erstmal ein HoA erzeugen, dann hast Du die Arrays zu jeder Tabelle parat.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ronnie
 2003-11-11 17:28
#71171 #71171
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hi Markus, benutze Hashes:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl

use warnings;
use strict;

my $daten;
my @tables = qw(Tabelle1.Spalte1 Tabelle1.Spalte2 Tabelle1.Spalte3
Tabelle2.Spalte1 Tabelle2.Spalte2 Tabelle2.Spalte3
Tabelle3.Spalte1);

for (@tables) {
my ($a, $b) = split(/\./, $_);
push @{$daten->{$a}}, $b;
}

for (keys (%$daten)) {
print $_,"\n";
print "--", $_, "\n" for (@{$daten->{$_}});
}

exit();


Ich hoffe das Beispiel hilft.
Crian
 2003-11-11 17:43
#71172 #71172
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Gegenvorschlag (wie oben skizziert):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

my @array = qw(
Tabelle1.Spalte1
Tabelle1.Spalte2
Tabelle2.Spalte3
Tabelle3.Spalte3
Tabelle3.Spalte2
Tabelle1.Spalte3
Tabelle2.Spalte1
Tabelle2.Spalte2
Tabelle1.Spalte4
Tabelle3.Spalte1
);

print Dumper \@array;

my %hoa = ();

#
# Array -> HoA
#
for (@array) {
my ($tab, $spalt) = split /\./;
if (exists $hoa{$tab}) {

push @{$hoa{$tab}}, $spalt;
}
else {
$hoa{$tab} = [ $spalt ];
}
}

print Dumper \%hoa;

#
# Sortieren der Arrays:
#
for (keys %hoa) {
$hoa{$_} = [ sort @{$hoa{$_}} ];
}

print Dumper \%hoa;


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
$VAR1 = [
'Tabelle1.Spalte1',
'Tabelle1.Spalte2',
'Tabelle2.Spalte3',
'Tabelle3.Spalte3',
'Tabelle3.Spalte2',
'Tabelle1.Spalte3',
'Tabelle2.Spalte1',
'Tabelle2.Spalte2',
'Tabelle1.Spalte4',
'Tabelle3.Spalte1'
];
$VAR1 = {
'Tabelle1' => [
'Spalte1',
'Spalte2',
'Spalte3',
'Spalte4'
],
'Tabelle2' => [
'Spalte3',
'Spalte1',
'Spalte2'
],
'Tabelle3' => [
'Spalte3',
'Spalte2',
'Spalte1'
]
};
$VAR1 = {
'Tabelle1' => [
'Spalte1',
'Spalte2',
'Spalte3',
'Spalte4'
],
'Tabelle2' => [
'Spalte1',
'Spalte2',
'Spalte3'
],
'Tabelle3' => [
'Spalte1',
'Spalte2',
'Spalte3'
]
};


:-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2003-11-11 17:44
#71173 #71173
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Die Sortierung der Arrays kann man natürlich weglassen, wenn die Spalten in der richtigen Reihenfolge stehen, aber sie tut auch nicht weh.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ronnie
 2003-11-11 17:52
#71174 #71174
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@crian: Wieso machst du die Fallunterscheidung ob die Tabelle im Hash schon existiert? Durch das push ist doch der Listenkontext erzwungen, oder?
Crian
 2003-11-11 17:55
#71175 #71175
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Stimmt, damit vereinfacht sich das Programm zu

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

my @array = qw(
              Tabelle1.Spalte1
              Tabelle1.Spalte2
              Tabelle2.Spalte3
              Tabelle3.Spalte3
              Tabelle3.Spalte2
              Tabelle1.Spalte3
              Tabelle2.Spalte1
              Tabelle2.Spalte2
              Tabelle1.Spalte4
              Tabelle3.Spalte1
             );

print Dumper \@array;

my %hoa = ();

#
# Array -> HoA
#
for (@array) {
   my ($tab, $spalt) = split /\./;
   push @{$hoa{$tab}}, $spalt;
}

print Dumper \%hoa;

#
# Sortieren der Arrays:
#
for (keys %hoa) {
   $hoa{$_} = [ sort @{$hoa{$_}} ];
}

print Dumper \%hoa;


bei gleicher Ausgabe.

Edit: Mir war nicht klar, dass er einfach eine Arrayreferenz anlegt, wenn ich auf den noch nicht vorhandenen Wert etwas pushe. Was passiert eigentlich, wenn dort schon etwas anderes war (etwa ein Skalar), würde dieser dann durch das neue anonyme Array mit dem einen gepushten Element ersetzt werden? Müsste wohl...\n\n

<!--EDIT|Crian|1068567119-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2003-11-11 17:56
#71176 #71176
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Und warum benutzt Du bei Dir die Pfeile "->"?

Edit: Achso, weil Deine $daten kein HoA, sondern eine HoAreferenz ist...\n\n

<!--EDIT|Crian|1068566247-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ronnie
 2003-11-11 17:58
#71177 #71177
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Yip, genau!
<< >> 9 Einträge, 1 Seite



View all threads created 2003-11-11 17:05.