Thomas: Werte aus Datei auslesen und addieren

Moin zusammen

ich habe da folgendes Problem und zwar möchte ich aus meiner Datei messages folgendes auslesen

Sent 98288270 bytes, received 131328276 bytes.

nach 24 Stunden wird ja zwangsweise die Leitung gekappt und in der Message Datei stehen dann imm der die gesendeten und Empfangenen Bytes

Nun soll die gesamte Datei nach den Werten send und received durchsucht werden und die Werte miteinander addiert werden

Sent + received = Ergebnis, nächste Zeile Sent + received + Ergebnis vorhergehende Zeile usw.

Ich habe da ein Script welches ich fuer die Trafficberechnung meines Webservers benutze

<html>
<head>

</head>
<body bgcolor="#000080" text="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000" font size="-1">

<?php
$datei = file('access_log');     //Datei einlesen
$traffic = 0;                    //Startwert für $traffic
foreach($datei as $zeile){       //Array durchlaufen
  $teile = explode("'",$zeile);  //explode anwenden
  $traffic += $teile[1]/1024000;         //$teile[1] zu $traffic dazuzählen

}
echo "Deine Webseite hat bis jetzt $traffic MB verbraucht";
?>
</body>
</html>

Kann man dieses umstricken um es fuer den obigen Fall zu verwenden ??

Wenn ja könnte mir jemand vielleicht die Zeile nennen bzw. es abaendern ??

Grueße Thomas

  1. hi,

    foreach($datei as $zeile){       //Array durchlaufen
      $teile = explode("'",$zeile);  //explode anwenden

    hier wird jede zeile an einem festgelegten trennzeichen (das hochkomma) aufgeteilt, ergebnis ist ein array.

    $traffic += $teile[1]/1024000;         //$teile[1] zu $traffic dazuzählen

    und hier wird der richtige array-wert dann draufaddiert.

    das mit dem trennen am ' wird bei deiner datenstruktur natürlich nicht klappen - du musst dir also eine möglichkeit überlegen, eine zeile im format
    Sent 98288270 bytes, received 131328276 bytes.
    derart zu zerlegen, dass du an die beiden zahlenwerte herankommst.

    reguläre ausdrücke würden sich dazu anbieten, sind allerdings nicht ganz trivial für anfänger.

    gruss,
    wahsaga

    1. Moin wahsaga

      Koenntest du mir dabei behilflich sein ??

      1. hi,

        Koenntest du mir dabei behilflich sein ??

        erste anlaufstelle zur beschäftigung mit regulären ausdrücken wäre hier wohl http://www.php.net/manual/de/ref.pcre.php

        die funktion, die du dann zum aufsplitten des strings eigentlich brauchst, ist http://www.php.net/manual/de/function.preg-match.php.

        gruss,
        wahsaga

        1. Ups....hab mir gerade mal so ein Script genommen und bei mir ausgeführt um es mir mal anzuschauen...
          Nur das jetzt auf meine Bedürfnisse umzustricken als blutiger Anfänger, ist wohl eine Nummer zu gross.....

          Könnte man mir zu veranschaulichung was fertiges posten, wäre echt nett, damit fange ich zum verständniss ehrlich gesagt mehr an...

          Soll kein Vorwand sein um meine grauen Gehirnzellen nicht selber anstrengen zu muessen nur hapert es bei mir mit der Syntax

          1. hi,

            Könnte man mir zu veranschaulichung was fertiges posten, wäre echt nett, damit fange ich zum verständniss ehrlich gesagt mehr an...

            du willst ja aus einem string in der form
            Sent 98288270 bytes, received 131328276 bytes.
            die beiden zahlen rausbekommen.

            da sollten wir mit einem relativ einfachen suchmuster hinkommen, weil dein string ja eigentlich nur aus zwei arten von bestandteilen zusammengesetzt ist: einmal zeichenketten, die alle zeichen ausser ziffern beinhalten dürfen, und einmal zeichenketten, die nur ziffern beinhalten dürfen.

            zeichenklasse für nur ziffern in einem regulären ausdruck wäre [0-9], [^0-9] wäre dann das gegenteil davon.

            wir wollen immer teilzeichenketten finden, die aus einem oder mehr dieser zeichen bestehen, also nehmen wir den quantifier +

            ![1]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+$!
            wäre also jetzt mein erster vorschlag für ein suchmuster(*).

            probiere jetzt also bitte mal folgendes aus:

            $meinezeile = 'Sent 98288270 bytes, received 131328276 bytes.';
            $treffer = array();
            preg_match('![2]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+$!', $meinezeile, $treffer);
            print_r($treffer);

            kommt da schon was bei raus ...?

            gruss,
            wahsaga

            (*) disclaimer: ich arbeite auch nicht so oft mit regulären ausdrücken, so dass in der erstellung dieser bei mir auch oft ein stück weit trial and error mit drinsteckt.


            1. ^0-9 ↩︎

            2. ^0-9 ↩︎

            1. Das ist was mir angezeigt wird

              Array ( [0] => Sent 98288270 bytes, received 131328276 bytes. [1] => 98288270 [2] => 131328276 )

            2. <?php
              $handle = popen("grep 'Sent [0-9]* bytes' messages.txt | awk '{print $7,$10};'", "r");
                while (!feof($handle)) {
                 $buffer = fgets($handle, 4096);
                 echo $buffer;
                }
              ?>

              Ergebnis sind die einzelnen Werte

              21032462 62718005 2592 2089 98288270 131328276

              wie bekomme ich diese nun alle miteinander addiert ???