Michael W.: Zeilenaufbau kontrollieren und zählen

hi

ich möchte aus eine txt datei betimmte zeilen kombinationen auslesen und zählen
bsp:

vorm doppelpunkt: und hier hinterm doppelpunkt
definition a: hallo
definition b: xxx

ich möchte nach dem schema x a: x x suchen: und für a eine definition abgeben.

sind diese zeilen gefunden möchte ich sie zählen.
wie ?

Danke

  1. Moin Michael

    ich dachte Dein Chef macht das jetzt, oder etwa doch nicht?

    Einen Lösungsvorschlag hatte ich ja schon mal gepostet

    http://forum.de.selfhtml.org/archiv/2002/8/20534/#m114986

    habe das mal um trim erweitert, da in Deiner Txt-Datei ja in jeder Zeile führende Blanks drin stehen, wenn ich mich recht erinnere.

    $fn = 'mytextfile.txt';
    $content = file($fn);
    $haystack = array();
    foreach($content as $c){
     list ($begriff,$text) = explode(':',$c);
     $haystack[ trim( $begriff) ][] = trim( $text);
    }

    /* Ausgabe des Resultates */
    foreach ($haystack as $k => $v){
     printf( 'Zum Begriff %s gibt es %d Zeilen<br>',$k,count($v) );
    }

    probier das noch mal aus.

    Es wäre vermutlich für alle Beteiligten einfacher wenn man die Lösung bzw. Problemstellung auf einen Thread konzentrieren würde.

    Dann bleibt das ganze für andere Leser und später auch im Archiv nachvollziehbar.

    Viele Grüße

    lulu

    1. $fn = 'mytextfile.txt';
      $content = file($fn);
      $haystack = array();
      foreach($content as $c){
      list ($begriff,$text) = explode(':',$c);
      $haystack[ trim( $begriff) ][] = trim( $text);
      }

      /* Ausgabe des Resultates */
      foreach ($haystack as $k => $v){
      printf( 'Zum Begriff %s gibt es %d Zeilen<br>',$k,count($v) );
      }

      soweit sieht das ganz gut aus, nur das es noch auf keinen begriff bzw auf begriffe fixiert ist.
      muss ich nicht mit $begriff1= 'text' arbeiten ?

      Danke

      1. Huhu Michael

        soweit sieht das ganz gut aus, nur das es noch auf keinen begriff bzw auf begriffe fixiert ist.

        Das ist erstmal nur zum Testen, ob das so mit dem vorliegenden
        Datenformat des txt-Files funktioniert.

        Was meinst Du mit "sieht gut aus"? Funktioniert es, oder hast Du es ausprobiert?

        muss ich nicht mit $begriff1= 'text' arbeiten ?

        Das wäre dann der zweite Schritt, das ist dann aber der einfachere Teil.

        Entweder man überspringt schon beim Einlesen in das Array die unerwünschten Zeilen.

        Durch z.B.

        if ( $begriff != 'MyFavourite') continue;

        nach der Zeile mit explode

        oder bei der Ausgabe

        printf( 'Zum Begriff %s gibt es %d Zeilen<br>','MyFavourite',count($haystack['MyFavourite']) );

        Viele Grüße

        lulu

        btw. = != ==

        1. Was meinst Du mit "sieht gut aus"? Funktioniert es, oder hast Du es ausprobiert?

          ja ich habe es ausprobiert und es funktioniert

          if ( $begriff != 'MyFavourite') continue;

          nach der Zeile mit explode

          oder bei der Ausgabe

          printf( 'Zum Begriff %s gibt es %d Zeilen<br>','MyFavourite',count($haystack['MyFavourite']) );

          ich möchte aber mehrere begriffe eintragen können ...

          Danke

          1. nachsatz

            das schema das wir haben ist ja folgendes:
            processor: Intel Pentium with MMX-167

            so ich möchte ja die verschiedenen processoren zählen.
            das heisst ich suche nach d er zeile mit sowas wie:
            processor: x1
            processor: x2

            am ende will ich halt eine tabelle haben wo steht welcher processor wie oft in der textfile auftaucht.

            processor    anzahl
            inel pentium   516
            amd athlon     498
            xxx            xxx

            das ist ja wieder was anderes, oder ?

          2. Huhu

            ich möchte aber mehrere begriffe eintragen können ...

            das geht dann z.B. ungefähr so

            1. Stecke die gewünschten Begriffe in ein Array.
            2. Mache ein Schleife über alle Array-Elemente (z.B. foreach)
            3. Ändere die Ausgabe entsprechend um, dass sie variabel wird

            also diese Zeile:

            printf( 'Zum Begriff %s gibt es %d Zeilen<br>','MyFavourite',count($haystack['MyFavourite']) );

            Viele Grüße

            lulu

            1. geht net:

              http://mitglied.lycos.de/djwoelk3/test/zeile/

              <html>
              <head>
              <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
              <title>Hardwareanalyse - auslese</title>
              </head>
              <body>

              <?php
              $fn = 'report.log';
              $content = file($fn);
              $haystack = array();
              foreach($content as $c){
               list ($begriff,$text) = explode(':',$c);
              if ( $begriff != 'processor') continue;
               $haystack[ trim( $begriff) ][] = trim( $text);
              }
              foreach ($haystack as $k => $v){
               printf( 'Zum Begriff %s gibt es %d Zeilen<br>','processor',count($haystack['processor']) );
              printf( 'Zum Begriff %s gibt es %d Zeilen<br>','pentium',count($haystack['pentium']) );
              }
              ?>

              </body>
              </html>

              was stimmt nicht ?

              1. Huhu

                geht net:

                <?php
                $fn = 'report.log';
                $content = file($fn);
                $haystack = array();
                foreach($content as $c){
                list ($begriff,$text) = explode(':',$c);
                if ( $begriff != 'processor') continue;
                $haystack[ trim( $begriff) ][] = trim( $text);
                }
                foreach ($haystack as $k => $v){
                printf( 'Zum Begriff %s gibt es %d Zeilen<br>','processor',count($haystack['processor']) );
                printf( 'Zum Begriff %s gibt es %d Zeilen<br>','pentium',count($haystack['pentium']) );
                }
                ?>

                was stimmt nicht ?

                du bringst die Keys (Schlüssel) mit den Values (Werte) durcheinander.
                Also nochmal von vorne ;-)

                • list ($begriff,$text) = explode(':',$c);

                diese Zeile zerlegt eine Zeile des TXT-Files am :

                • if ( $begriff != 'processor') continue;

                wenn $begriff != 'processor' dann ignorieren
                muss an dieser Stelle noch getrimmt werden, da $begriff ja Blanks enthält.

                • $haystack[ trim( $begriff) ][] = trim( $text);

                hier wird $begriff als KEY für den Array-Eintrag genommen
                in diesem Falle ist es ebenfalls ein Array, an dieses wird als neues Item $text angehängt.

                • printf( 'Zum Begriff %s gibt es %d Zeilen<br>','pentium',count($haystack['pentium']) );
                  Soweit so einfach, jetzt möchtest Du alle Processortypen ausgeben.
                  Die stehen aber nicht als KEY sondern als VALUE im Array,
                  deshalb kann es so nicht funktionieren.

                Die stehen als Array in $haystack['processor'].

                Zum ausgeben probier einfach mal

                echo join('<br>',$haystack['processor']);

                da sind jetzt vermutlich noch allerhand doppelt Einträge drin.

                Um diese zu zählen gibt es in PHP eine Funktion array_count_values, aber hier mal zu Fuss.

                $Result = $haystack['processor'];
                $occ    = array();
                foreach($Result as $r){
                 $occ[$r] ++;
                }

                Die Ausgabe erfolgt dann wie gehabt

                foreach($occ as $k => $v){
                  printf( 'Vom Typ %s gibt es %d <br>',$k,$v);
                }

                so far...

                lulu

                1. jetzt bin ich sowieso durcheinander ...
                  ich steh wiedermal total aufm schlauch, vorallem weil es gerade eine planänderung gab
                  ich habe die report.log auch im netzt stehen
                  http://mitglied.lycos.de/djwoelk3/test/zeile/report.log

                  die planänderung ist nämlich folgende:
                  wie möchten am ende ein menü haben das wie folgt aussieht:

                  1. Alle User, deren Prozessoren und deren Server auflisten.
                  (kann man alles aus der report.log auslesen)

                  2. Alle User von einzelen Server-Standorten und deren prozessoren auslesen)

                  3. einzelne user auslesen

                  1. alle
                  2. server
                  3. user

                  das shell script wird folgendes machen:

                  angenommen in worms haben sich alle user bis jetzt schon einmal eingeloggt. jetzt befinden sich in deren netz in einem speziellen ordner alle %user%.log `s

                  user1.log
                  user2.log
                  user3.log

                  das script kopiert diese dateien nach frankfurt in den ordner /worms

                  und so passiert das mit allen anderen auch.

                  /worms
                  /köln
                  /friedberg
                  /und so wieter

                  da jetzt alle dateien auf unserem server sind dürfte es mit php ja jetzt kein problem mehr sein die einzelnen dateien auszulesen.

                  fangen wir mal mit der user auslese an:
                  ich würde gerne wissen welche hardware der user "muellemu" aus köln hat.

                  dann klicken wir im menü auf user-check (oder was weiss ich ...)
                  und dann folgen dadrauf 2 eingabefelder:
                  username und serverstandort
                  diese 2 angaben speichern wir in 2 variablen:
                  $user und $server
                  auf der ausgabe seite soll dann folgendes stehen:

                  Der User ist: $user_script (_script daher, da es das script aus der datei erfahren soll welcher user das ist und die varaible $user ist nur zur verwertung des scripts gedacht)
                  Der Server ist: $Server_script (hier das selbe)

                  Processor: $processor
                  andere bezeichnungen: $x

                  ok ?
                  bevor wir weiter machen warte ich erstmal auf dein verständnis

                  P.s.: lulu, ist das weiblich ?

                  1. Holla

                    die planänderung ist nämlich folgende:
                    wie möchten am ende ein menü haben das wie folgt aussieht:
                    ok ?
                    bevor wir weiter machen warte ich erstmal auf dein verständnis

                    Das hatte ich ja schon mal vermutet das da noch ein
                    Bündel Wünsche nachkommt.

                    Man kann das natürlich mit den txt-Files machen aber das wird
                    relativ umständlich. Ist eigentlich auch unnötig, da
                    man die Auswertungen direkt in SQL formulieren kann.

                    Es würde sämtliche Auswertungen extrem vereinfachen, wenn die Daten
                    in einer Datenbank vorliegen würden.

                    Da bräuchtet ihr halt ein Skript das die Logfileeinträge in eine  solche Datenbank importiert.

                    Evtl. reicht Euch ja auch einfach ein SpreadSheet-Programm wie z.B. Excel, da kann man dann ja ggf. auch Filter einstellen, aber schön ist das auch nicht.

                    Evtl. wäre es auch eine Hilfe bei der Konzeption die Sache "von oben"
                    her anzugehen.
                    Also wie soll das finale Userinterface aussehen
                    mit welchen Funktionalitäten etc.,
                    dann daraus Schlussfolgern wie die Datenhaltung sein muss
                    und dann entsprechend den Datenimport( die Datenauswertung ) machen.

                    Alles in allem ist das schon etwas aufwändiger was Ihr da vorhabt oder?

                    P.s.: lulu, ist das weiblich ?

                    hört sich so an, könnte aber auch ein fieser Betrug sein ;-)

                    Viele Grüße

                    lulu

                    1. ja das ist eine grössere sache, aber datenbanken habe ich bis jetzt noch nie angewendet.

                      ich möchte jetzt erstnochmal ein suchscript.
                      der folgende zeilen sucht und in einer variablen speichert und sich per echo ausgäben lässt:

                      "USER="
                      "SERVER="

                      wenn ich nach diesen begriffe suche gibt es keine doppelt - das macht es einfach. Suche ich nach processor findet das alte script aber auch coprocessor und genau den speichert er dann in der variablen. leider ist auch das schema gleich
                                   processor: x
                                 coprocessor: x
                                   ^^^^^^^^^^^
                      aber wenn ich hier space mitsuche dann dürfte dass doch gehen oder ?

                      ^^processor: x
                                 coprocessor: x
                                 ^^^^^^^^^^^^^

                      ich probiers mal aus und warte deine meinung in der zeit ab.
                      bist du jetz n typ oder eine atraktive frau die ein wenig schüchtern ist (ich glaube ein typ, denn frauen denken nicht wie mein ausbilder, denn die idee mit dem excel filter hatte er vorher ...)

                      1. Hallo

                        ich probiers mal aus und warte deine meinung in der zeit ab.

                        ausprobieren ist gut, aber warte mal lieber nicht auf feedback, ich muss jetzt erstmal mal ein bischen arbeiten und dann bin ich ein paar Tage offline (Hurra)

                        so far

                        lulu

                        1. oh oh - wie meinst du das ?
                          hast du kein bock mehr ? :|

                          du bist doch die (oder der) einzigste die/der mir helfen kann.

                          1. Huhu

                            hast du kein bock mehr ? :|

                            den "bock" solltest Du haben, es heisst ja self- und nicht gethtml.
                            Deine Aufgabenstellung ist schon etwas komplex.
                            Mit eben mal ein bischen helfen ist es da also nicht getan.
                            Ich poste ja gerne mal ein kurzes Snippet, aber das was Du brauchst ist schon etwas größeres und das gibt es nur wenn Du es selbst schreibst.

                            So wie ich das einschätze müsstest Du Dir erstmal ein paar solide
                            Grundlagen aneignen.

                            Deine Aufgabe ist ja durchaus interessant, an der kann man auch vieles lernen, aber versuche es in kleinere Problemstellungen zu unterteilen.

                            Hier noch ein paar Links wo Du ggf. fündig wirst

                            http://php.net/

                            Diese beiden hier am Besten komplett durcharbeiten, auch wenn man vieles wieder vergisst hat man doch ungefähr eine Ahnung was es für Möglichkeiten gibt.

                            http://www.php.net/manual/en/ref.array.php
                            http://www.php.net/manual/en/ref.strings.php

                            Tipp wenn Du in der URL das "en" durch "de" ersetzt hast Du
                            die Seiten in deutscher Sprache.

                            http://php-builder.com/
                            http://php-faq.de/

                            einzigste

                            gesprochen ist das schon schlimm, aber bitte schreib das nicht.

                            have a nice weekend

                            so far

                            lulu

                      2. na also - es hat funktioniert:

                        --------------- (http://mitglied.lycos.de/djwoelk3/test/zeile/zeile_auslesen.php)
                        <html>
                        <head>
                        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
                        <title>Hardwareanalyse</title>
                        </head>

                        <body>
                        <?php
                        $a = "USER=";
                        $b = "SERVER=";
                        $c = " Processor: ";
                        $datei = file('report.log');
                        for($i=0;$i<count($datei);$i++)
                          {
                          if(eregi($a,$datei[$i])) $gz1 = $datei[$i];
                          if(eregi($b,$datei[$i])) $gz2 = $datei[$i];
                          if(eregi($c,$datei[$i])) $gz3 = $datei[$i];
                          }
                        ?>
                        <div align="left">
                          <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
                            <tr>
                              <td><?php echo $gz1; ?></td>
                            </tr>
                            <tr>
                              <td><?php echo $gz2; ?></td>
                            </tr>
                            <tr>
                              <td><?php echo $gz3; ?></td>
                            </tr>
                          </table>
                        </div>
                        </body>
                        </html>
                        -------------

                        jetzt habe ich aber noch eins nicht eingebaut:
                        $datei = file('$server."/".$user.".log"');

                        ist das so OK ? ne oder ?

                        Danke