WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Mehrdimensionale (Hash)-Arrays in Perl? (http://www.wcm.at/forum/showthread.php?t=22009)

SNo0py 23.05.2001 11:38

Mehrdimensionale (Hash)-Arrays in Perl?
 
Ich möchte in Perl gerne eine Tabelle aufbauen:
0 a b c d e
1 x x x x x
2 x x x x x
3 x x x x x, wobei x immer ein beliebiger Zahlenwert sein kann.

1.) Sind in Perl mehrdimensionale Arrays möglich?

2.) Wie füge ich z.B. eine Spalte zwischen c und d ein (die Liste wird Zeilenweise aufgebaut, es können aber Spalten dazukommen!)

fran 23.05.2001 14:45

Hallo,
1. soweit mir bekannt ist, kann man mit Perl nicht direkt mehrdimensionale Arrays erstellen.

Es ist aber indirekt möglich - z.B.:

@spalte1 = (a,a1,a2);
@spalte2 = (b,b1,b2);
@matrix = (\@spalte1,\@spalte2);

2. Wenn keine Sortierfunktionen etc. nötig sind, kannst Du einzelne Elemente (in diesem Fall Arrays) mit folgenden Befehlen hinzufügen oder entfernen:

PUSH: am Ende anfügen,
UNSHIFT: am Anfang anfügen,
POP: das letzte Element wird entfernt
SHIFT: das erste Element wird entfernt.

also z.B. eine Spalte zwischen 1 und 2:

pop @matrix;
push(@matrix, @spalteX);
push(@matrix, @spalte2);

Das müsste funktionieren - probiers aus.

grüße fran

MANX 23.05.2001 15:59

Hi!

Mehrdimensionale Arrays sind in Perl kein Problem. Jetzt weiß ich nicht wie du Deine Tabelle aufbauen willst.
Z.B aus einer Textdatei einlesen, wobei jede Zeile einen Datensatz darstellt, die einzelnen Elemente durch z.B. Tabulatoren getrennt:

open (DATEI, "$DATEI") or die "Kann $DATEI nicht öffnen: $!\n";
while (<DATEI>)
{
@temp = split /\t/;
push @daten, [ @temp ];
}
close DATEI;

erstes Element erste Spalte: $daten [0][0]

Über's Spalten einfügen mach' ich mich noch schlau.

MfG

MANX

SNo0py 23.05.2001 16:04

Problem.!
 
@fran:

Erstmal danke für die Antwort, aber:

Ich hab leider keine Ahnung, wieviele Spalten und Zeilen ich haben werde - das ist variabel!!!

mfg - Mike

SNo0py 23.05.2001 16:23

Hintergrund
 
Der Hintergrund der Sache ist der folgende:

Ich habe mehrere Dateien, in denen etwa folgendes steht:
14.5.01|185|
15.5.01|92|
17.5.01|103|
usw...
Jede Datei repräsentiert eine andere Datei auf meinem Webserver und die Zahlen dahinter sind die Zugriffe.

Jetzt möcht ich aber nicht immer jede Datei extra ansehen sondern auch eine Übersicht (als Tabelle haben):

Datum Seite 1 Seite 2 ...
14.5.01 123 456
15.5.01 856 315 ...
...

Diese dann als HTML auszugeben und eventuell irgendwas zusammenzuzählen ist kein Problem mehr :)

Das Problem bei der Sache ist nur, dass nicht auf jede Kategorie jeden Tag zugegriffen wird (d.h. ich kann nicht stur einlesen!!!)

Klar?!?! Ich hoffe ich hab rübergebracht, was ich sagen wollte :confused:

MANX 23.05.2001 19:27

Hallo SNo0py!

Ist sicher keine triviale Angelegenheit. Aber so auf die Schnelle ein Vorschlag:
Wenn ich's richtig verstanden habe.
Für jede Webseite eine Datei. -> alle Dateienamen in einer Liste abspeichern -> mit einer foreach-Schleife jede Datei in eine Tabelle einlesen

foreach blabla...
open (DATEI, "$DATEI") or die "Kann $DATEI nicht öffnen: $!\n";
while (<DATEI> )
{
# wir splitten jede Zeile in drei Elemente: Erstes:14.5.01 Zweites:185 Drittes:\n

@temp = split /\|/;
push @daten, [ @temp ];
}
close DATEI;

# wir entfernen das dritte Element jeder Zeile da wir es nicht brauchen

for $i ( 0 .. $#daten )
{
pop @{@daten[$i]}
}

Und dann wird's halt lustig:
Einsortieren: Steht in jeder Datei immer das Datum aufsteigen, oder ist manchmal ein Tag ausgelassen?

Wenn keine Tage fehlen, würde ich das erste Array hernehmen und mit allen anderen das Datum (erstes Element) vergleichen, wenns passt hängst das Element in die Zeile dazu!

Ist ein bisschen konfus geworden aber vielleicht hilft's ja ein bisschen.

MANX

fran 23.05.2001 20:09

@SNo0py:
Tut mir leid, aber da habe ich Dich völlig missverstanden.
D. h. Du hast Zahlen als Datensätze in einzelnen Dateien vorliegen, die Du nun in eine einzige Datei gesammelt haben möchtest - verstehe ich das richtig?

Wenn Du nach Datum sortierst, kannst Du vielleicht zuerst leere Dateien für jeden Tag eines Monats anlegen - und danach das Eingangsdatum der Daten mit jenem der Dateien vergleichen, um sie in die richtige zu schreiben. Danach liest Du alle Daten aus den Einzeldateien in eine Datei ein.

Das ist meine Theorie - bei der Umsetzung, naja... Ich bin auch gerade erst dabei, Perl zu lernen - vielleicht kann ja noch jemand helfen, die Lösung würde mich interessieren.

grüße fran

SNo0py 27.05.2001 20:45

Ich machs anders :-)
 
Ich versuch es jetzt anders, indem ich das Counting-Script umschreibe und gleich alle Daten in eine Datei schreibe (als Tabelle); die "paar" Daten die ich bis jetzt habe, übernehm ich händisch mit Ultra-Edit in die neue Datei....

Aber falls wer eine Lösung hat, bin ich trotzdem sehr dankbar, da die jetzige Counting-Version schneller ist!


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag