Perl Suche Perl Programmierer...kleine Statistik

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hallo

Falls es hier jemanden gibt der in Perl fit ist, ich hätte eine kleine Sache für Entgeld natürlich.

Was ich benötige!

Es soll zu 3 verschiedenen externen Accounts verbunden werden und jeweils 2 Sachen ausgelesen werden.
Aus diesen String "es sind Zahlen" soll eine kleine Statistik gebastelt werden und zwar jeweils....

Hörer heute Stream 1 ()
Hörer heute Stream 2 ()
Hörer heute Stream 3 ()

Hörer gestern Stream 1 ()
Hörer gestern Stream 2 ()
Hörer gestern Stream 3 ()

Hörer letzte Woche Stream 1 ()
Hörer letzte Woche Stream 2 ()
Hörer letzte Woche Stream 3 ()

Hörer letzten Monat Stream 1 ()
Hörer letzten Monat Stream 2 ()
Hörer letzten Monat Stream 3 ()

Hörer seit Zählung Stream 1 ()
Hörer seit Zählung Stream 2 ()
Hörer seit Zählung Stream 3 ()

Am liebsten wäre es mir das jeweils für einen Stream eine Textdatei erstellt und immer upgedatet wird, die Infos darin würde ich dann mit PHP auslesen bzw. anzeigen.

Das Basisscript in Perl um sich in einen externen Account einzuloggen und die Infos zu holen liegt vor, aus dem müsste nun halt die Statistik in Textdateien gebastelt werden.
Das BasisScript soll dann per CronJob alle 5 Minuten ausgeführt werden, das ganze läuft aktuell schon nur fehlt mir die Statistik, habe nur Hörer aktuelle und gestern, das sind auch nur die Infos die man bekommen kann und aus denne soll das ganze realisiert werden. Perl habe ich absolut keine Ahnung und auch keine Zeit mich jetzt nur für diese kleine Sache dem anzunehmen.

Wer Interesse hat bitte sofort mit Preisvorstellung, ein Freundschaftspreis wäre nett, ist ja denke ich auch keine große Sache nur rechnen bzw. addieren.

Das ganze wie ich es anzeigen möchte sieht man hier ...
http://www.discoradioaction.eu/index.php?distat=statload&rightcont=discoplayer&leftcont=discostats
 
Wenn ich dich richtig verstehe, dann hast du ja schon Hörer heute und gestern. Speicher die doch einfach in Dateien ab, bei denen das Datum im Dateinamen steht (bei jedem neuen Cronaufruf entsprechend überschreiben). Dann lässt sich das einfach summieren.
(Einfacher wäre es ja mit ner Datenbank aber das willst du ja nicht wie ich deinem anderen Thread entnehme)
 
das hier ist eine andere sache, diese stimmt ja zu 100%, würde ich gerne via datenbank machen nur habe ich von perl 0 ahnung und möchte mich da jetzt auch nicht wegen eines scriptes einlernen.
 
Wenn du Infos dazu rausrückst, in welcher Form die vom Account geholten Daten vorliegen und ggf. welche Datenbank (MySQL, MS SQL, SQLLite etc.) du gerne verwenden würdest, lässt sich das entsprechende Script auch schreiben.

Aber ohne die Information, ob die Daten von diesem Basisscript als Textdatei, Array, Hash oder sonstwas geholt werden, ist es etwas kompliziert, diese Daten auszuwerten.

Ansonsten ist das halt hauptsächlich eine Frage, wie du die Daten speichern willst und ob "Letzte Woche" "Mo-So" oder "die letzten 7 Tage" meint. Über Dateien hast du halt das Problem, dass du beim Auswerten ggf. abfangen musst, wenn eine Datei grade vom Cronjob aktualisiert wird und du nicht lesend drauf zugreifen kannst.
Auf der anderen Seite musst du für die Datenbanklösung ggf. das passende Perl-Modul nachinstallieren und natürlich einen DB-Server am laufen haben (was ich bei einem Webserver aber annehme).
 
Die Daten mit Hörer vom Vortag liegen jeden Abend nach 0Uhr als Textdatei auf meinem Server!
Das ganze sollte in der späteren Wartung am frühen Morgen ausgewertet werden wo ich eh vorhabe die Seite für min. 30 Minuten vom Netz zu nehmen.

Hier finden keine Schreibzugriffe von Usern statt und denke das man das locker mit Dateien machen könnte.
Also, Hörer aktuell und vom Vortag habe ich, was ich also noch benötige ist das addieren für eine Woche, also immer für die Woche davor, dann für den Montat davor sowie einmal gesamt seit beginn der Zählung.

Es wäre am besten wenn die ganzen Infos in einer Datei a Zeile geschrieben werden....

1. Aktuell
2. Vortag
3. leztze Woche
4. letzten Monat
5. gesamt

dann brauche ich diese Datei nur mit $bla[0]; [1]; [2]; auslesen und die Zeile anzeigen.
Es soll nichts weiter gespeichert werden, keine History.
 
Mir haben immernoch ein paar Infos gefehlt, aber ich habe jetzt einfach mal bzgl. bestimmter Punkte Annahmen angestellt und dir was ganz einfaches zusammengebastelt.

Meine Annahmen:
- Die Anzahl der Hörer des Vortags liegen in einer Textdatei, die nichts außer diesem Zahlwert enthält.
- Die Anzahl der Hörer für Heute liegt nicht als Datei vor, ist aber bekannt, kann also als Parameter beim Aufruf übergeben werden.
- "letzte Woche" beschreibt die Woche, in der wir uns zum Ausführungszeitpunkt des Scripts befinden.
- "letzter Monat" beschreibt den Monat, in dem wir uns zum Ausführungszeitpunkt des Scripts befinden.

Aufruf des Scripts wäre also
Code:
perl -w script.pl "dbdatei" "gesterndatei" "heutewert"
wobei "dbdatei" auf eine Datei zeigt, die das Script als Datenbank verwendet, "gesterndatei" auf eine Datei zeigt, die die Anzahl der Hörer von gestern enthält und "heutewert" eine Zahl ist, die der Anzahl der heutigen Hörer entspricht.

Die Ausgabe der Werte erfolgt im von dir gewünschten Format. Ein Wert pro Zeile in der Reihenfolge: Heute, Vortag, Woche, Monat, Gesamt.
Allerdings nicht in eine Datei, sondern nach STDOUT. Du kannst die Ausgabe aber wie gewohnt per Parameter
Code:
>ausgabe.txt
in eine Datei umleiten.

Auszuführen wäre das Script in dieser Form einmal pro Stream. Hat allerdings den Vorteil, dass du die Menge der Streams variieren kannst, ohne das Script anpassen zu müssen.

Falls du eine genauere Erklärung oder Anpassung zum Script brauchst, sag einfach bescheid.

Script:
Code:
#!C:\Perl64\bin\perl
#
# Aufruf-Parameter
# ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
# 1: Datenbank-Datei, in der Hörer pro Tag abgelegt werden
# 2: Quelldatei, aus der die Hörer für den gestrigen Tag gelesen werden
# 3: Anzahl der Hörer für den heutigen Tag
#
use Date::Calc qw(:all);
#Initialisierung benötigter Variablen
my $dbfile = shift || 'streamdb.txt';
my $source = shift || 'streamdata.txt';
my $heute = shift || 0;
#Zeilenformat : YYYYMMDD: ####, wobei #### = Anzahl der Hörer
my $dblineexpr = '(\d{4})(\d{2})(\d{2}): (\d*)';
#Zeilenformat: ####, wobei #### = Anzahl der Hörer gestern
my $sourceexpr = '(\d*)';
my @today = Today();
my @yesterday = Add_Delta_Days(@today,-1);
my @monday = Monday_of_Week(Week_of_Year(@today));
my $delta = Delta_Days(@monday,@today);
my %daten;
#Bereits gespeicherte Werte auslesen
if((-f $dbfile)&&(-r $dbfile))
{
  open FILE ,"<$dbfile" || die "Kann $dbfile nicht lesend öffnen.\n";
  @lines = <FILE>;
  close FILE;
  foreach(@lines)
  {
    m/$dblineexpr/;
    $daten{int($1)}{int($2)}{int($3)} = int($4);
  }
}
#Gestern-Wert auslesen
if((-f $source) && (-r $source))
{
  open FILE ,"<$source" || die "Kann $source nicht lesend öffnen.\n";
  @lines = <FILE>;
  close FILE;
  if($#lines>=0)
  {
    $lines[0] =~ m/$sourceexpr/;
    $daten{$yesterday[0]}{$yesterday[1]}{$yesterday[2]}=int($1);
    #Daten speichern, da verändert
    if((-f $dbfile)&&(-w $dbfile))
    {
      open FILE ,">$dbfile" || die "Kann $dbfile nicht schreibend öffnen.\n";
      while (($year,$jahre) = each %daten) 
      {
        while (($month,$tage) = each %$jahre)
        {
          while (($day,$value) = each %$tage)
         {
            printf FILE "%04d%02d%02d: %d\n", $year, $month, $day, $value;
          }
        }
      }
      close FILE;
    }
  }
}
#Wert für heute einfügen
$daten{$today[0]}{$today[1]}{$today[2]} = int($heute);
#Rückgabewerte initialisieren
my ($gestern,$woche,$monat,$alles) = (0,0,0,0);
#Rückgabewerte berechnen
# Gestern
$gestern = $daten{$yesterday[0]}{$yesterday[1]}{$yesterday[2]} if defined($daten{$yesterday[0]}{$yesterday[1]}{$yesterday[2]});
# Woche
for($i=0;$i<=$delta;$i++)
{
  @day = Add_Delta_Days(@today,-$i);
  $woche+=$daten{$day[0]}{$day[1]}{$day[2]} if defined($daten{$day[0]}{$day[1]}{$day[2]});
}
# Monat
for($i=1;$i<=$today[2];$i++)
{
  $monat+=$daten{$today[0]}{$today[1]}{$i} if defined($daten{$today[0]}{$today[1]}{$i});
}
# Gesamt
while (($year,$jahre) = each %daten) 
{
  while (($month,$tage) = each %$jahre)
  {
    while (($day,$value) = each %$tage)
    {
      $alles+=$value;
    }
  }
}
$,="\n";
print ($heute,$gestern,$woche,$monat,$alles);
 
Zurück
Oben