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



#!/COMMUNITY

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




08.02.2012 / 22:29

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

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




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


BeitragPerl Auswertung 2 er DB Tables
Seitenanfang
Hallo,

ich möchte gerne eine Auswertung über 2 Tabellen machen und hab dabei ein grundsätzliches Problem.

Ich beschreibe mal im folgenden die Auswertung:

Tabelle 1:
1 Feld: Datum

Tabelle 2:
2 Felder Datum User

Ich möchte für die vergangenen 30 Tage die Sätze aus der DB 1 lesen.

Nun möchte ich für die Sätze aus DB 2 zu dem Datum aus DB 1 auswerten, welcher User rückwirkend am Stück (!! - also ohne Lücken) immer zu den Daten aus DB 1 in der DB steht.

Bsp.: Für 3 Tage anstatt 30

Daten in DB:
heute
User1
User2
User3
User4

gestern
User1
User2
User4

vorgestern
User1
User3

Auswertung (sortiert nach Anzahl):
Auswertung für 3 Tage:
User1 3 mal
User2 2 mal
User4 2 mal
User3 1 mal

Datum: 21.11.2005-20:04

Beitragre: Perl Auswertung 2 er DB Tables
Seitenanfang
Hi,
also die Tabelle habe ich mir jetzt nicht extra gebaut (die erste Tabelle brauchst Du überhaupt nicht).

Aber wenn es um das Zählen der ununterbrochenen Tage geht, kannst Du das so machen:


#!/usr/bin/perl -w

use strict;
my %dates;
my %users;
my %count;

while (<DATA>) {
chomp;
my($date, $user) = split(/\s/);

# Datum mit allen Usern
$dates{$date}{$user}++;

# Lookup Table fuer User
$users{$user}++;
}

# Durch die Liste der User gehen
foreach my $user (keys %users) {

# den Wert 0 als Startwert in Array legen
push(@{$count{$user}}, 0);

# jedes Datum abklappern
foreach my $date (sort keys %dates) {

# Der User war an diesem Tag da
if ( $dates{$date}{$user} ) {
# deshalb den letzten Wert um 1 erhhen
$count{$user}[-1]++;
}
else {
# neuen Startwert setzen (push 0)
push(@{$count{$user}}, 0);
}
}
}

# den hoechsten Wert raussuchen und zuweisen
$count{$_} = (sort {$b <=> $a} @{$count{$_}})[0] for keys %count;

# sortiert nach Laenge ausgeben
print map {"$_ war $count{$_} mal am Stueck da\n" } sort {$count{$b} <=> $count{$a}} keys %count;

__DATA__
20051123 user1
20051123 user2
20051123 user3
20051123 user4
20051122 user1
20051122 user3
20051122 user4
20051121 user2
20051121 user4

__END__

Gibt Folgendes aus:

user4 war 3 mal am Stueck da
user1 war 2 mal am Stueck da
user3 war 2 mal am Stueck da
user2 war 1 mal am Stueck da


Gruss,
svenXY

Datum: 23.11.2005-10:19

Beitragre: Perl Auswertung 2 er DB Tables
Seitenanfang
Ja vielen Dank schon mal für die Hilfe, aber wenn beispielsweise User5 am 21.11.2005 da war, erscheint dieser ebenfalls angezeigt.

Ich würde gerne rückwirkend die User auswerten, so dass die Zeitspanne der User vom letzten Tag an angezeigt wird, d.h. vom größten Datum (23.11.2005) bis zu ersten Lücke (wann der User weiter in der Vergangenheit da war ist egal; nur bis zur ersten Lücke vom größten Tag an).

Ich würde es gerne selber lösen, aber ich benötige nur ein Perlskript, da ich ansonsten im SAP bei Abap/4 angesiedelt bin.

Vielen Dank schon mal an die Community im voraus.

Wolle

Datum: 23.11.2005-20:21

Beitragre: Perl Auswertung 2 er DB Tables
Seitenanfang
dann musst Du rückwärts durch die Daten gehen und kannst aber bei einer Lücke gleich zum nächsten User springen:

...
# Durch die Liste der User gehen
foreach my $user (keys %users) {

# jedes Datum abklappern (RUECKWAERTS!!!)
foreach my $date (sort {$b <=> $a} keys %dates) {
# Der User war an diesem Tag da
if ( $dates{$date}{$user} ) {
# deshalb um 1 erhoehen
$count{$user}++;
}
}
}

# sortiert nach Laenge ausgeben
print map {"$_ war $count{$_} mal am Stueck da\n" } sort {$count{$b} <=> $count{$a}} keys %count;


Gruss,
svenXY

Datum: 24.11.2005-08:58

Beitragre: Perl Auswertung 2 er DB Tables
Seitenanfang
halt, Fehler!!! So zählst Du jede Anwesenheit an allen Tagen! Was fehlt, ist das "last", das, wenn der User an diesem Tag nicht da war, zum Ende der Datums-foreach-Schleife springt, also zum nächsten Durchlauf der User-foreach-Schleife:

...
# Durch die Liste der User gehen
foreach my $user (keys %users) {
# jedes Datum abklappern (RUECKWAERTS!!!)
foreach my $date (sort {$b <=> $a} keys %dates) {
# Der User war an diesem Tag da
if ( $dates{$date}{$user} ) {
# deshalb um 1 erhoehen
$count{$user}++;
}
else {
last;
}
}
}

# sortiert nach Laenge ausgeben
print map {"$_ war $count{$_} mal am Stueck da\n" } sort {$count{$b} <=> $count{$a}} keys %count;


Gruss,
svenXY

Datum: 24.11.2005-09:03

Beitragre: Perl Auswertung 2 er DB Tables
Seitenanfang
Hierbei sortiert er vollkommen durcheinander und deshalb passt es leider nicht. Wär supi, wenn du dir s nochmals anschauen könntest.

MfG
Wolle

Datum: 24.11.2005-19:30

Beitragre: Perl Auswertung 2 er DB Tables
Seitenanfang
ähhhh?
Bei mir kommt da:

Daten:
20051123 user1
20051123 user5
20051123 user2
20051123 user3
20051123 user4
20051122 user1
20051122 user3
20051122 user4
20051121 user5
20051121 user2
20051121 user4
20051120 user5

Ergebnis:
user4 war 3 mal am Stueck da
user1 war 2 mal am Stueck da
user3 war 2 mal am Stueck da
user5 war 1 mal am Stueck da
user2 war 1 mal am Stueck da

Was ist daran unsortiert?

Datum: 25.11.2005-09:20

-






-
-