Ankündigung

Einklappen
Keine Ankündigung bisher.

aus textdatei einzelne werte einlesen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • aus textdatei einzelne werte einlesen

    Hallo Community,

    Ich möchte gerne alle Dateien innerhalb eines Verzeichnisses mit einem PHP-Skript einlesen und alle Werte mit den zugehörigen Schlüsselworte als Keys pro Datei in ein Array speichern.
    (Bsp. $array[host_name] = test-pc1)
    Den Werte des Arrayfeldes "$array[host_name]" würde ich gerne ich einer Auswahlliste anzeigen. (für jede Datei soll ein eigenes Array erstellt werden).

    Die Ausgangsdatei sieht wie folgt aus:

    Code:
    define host{
            use             generic-host    
            hostgroups      windowsserver,testserver
            host_name       test-pc1
            contact_groups  testcontact1,contact2
            address         192.168.77.6
            check_command   check-host-alive
            parents         server01
            max_check_attempts 5
            }

    (Die Reihenfolge und Position der Schlüsselworte ist unterschiedlich. Das umschließende "define host{}" ist immer gleich.)

    Meine bisherigen Überlegungen bezüglich des PHP-Codes.
    ich vermute dass ich zwei Array benötigt:
    -eines mit den gesamten Daten eines Hostes
    -eines mit den gesamten hostnames

    Meine Idee für das Anzeigen der Hostnames im Auswahlemnu:

    PHP-Code:
    <html>
    <head>
      <title> </title>
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
    </head>

    <body>
    <?php
    <form action="host.php" method="post">
    <
    p><select name="hostname">
    for (
    $i=0$i count($file); $i++)
    {
        <
    option value="$file[$i]"$file[$i] </option>
    }
    </
    select></p>
    <
    p> <input type="submit" />
    </
    form>


    $verzeichnis "$dir_hosts";

    if ( 
    is_dir $verzeichnis ))
    {
        if ( 
    $handle opendir($verzeichnis) )
        {
            
    // einlesen der Verzeichnisses
            
    while (($file readdir($handle)) !== false)
            {
                
    $file $filelist[];
                return 
    $file;
            }
            
    closedir($handle);
        }
    }

    foreach(
    $file as $key=>$value)
    {
    $userdatei fopen("$value","r");
    while(!
    feof($userdatei))
       {
       
    $zeile[] = fgets($userdatei,1024);
       
    //mittels $preg_match nach "define{" suchen und nchfolgende zeilen bis "}" einlesen
       
    }
    fclose($userdatei);
    }
    ?>

    </body>
    </html>
    Die Datei "host.php" ist auch die Datei welche die Daten auslesen soll.

    Für das Einlesen der Dateinamen habe ich folgenden Ansatz:
    Variable "$dir_hosts" wird in der Datei index.php definiert und von dort übernommen.

    Wäre für Unterstützung dankbar.


  • #2
    Das funktioniert so nicht. Du kannst PHP und HTML so nicht mischen. PHP wird auch zu einem ganz anderen Zeitpunkt ausgeführt als HTML gerendert wird.

    Der PHP-Interpreter springt nur dann an, wenn die magischen <?php und ?> im Code erscheinen. Der Rest ist quasi "Text" und wird nicht angefasst. Du kannst mit PHP auch andere Medien als HTML erzeugen.
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      Hab meine Codedarstellung im ersten Thread korrigiert.

      Kommentar


      • #4
        nicht überall.
        zudem verstehe ich nicht was du willst und was genau schiefgeht.

        Kommentar


        • #5
          Ich möchte folgendes Erreichen:

          -das mittels "$dir_hosts" vorgegebene Verzeichnis durchsuchen und alle Dateinamen in $file[] schreiben.

          -jede gefundene Datei öffnen und die Schlüsselworte undWerte im Block "define{}" in $filename[] speichern.

          - Die Werte sollen über die Keys in Textfelder ausgegeben werden, so dass sie bearbeitet werden können.

          -Nach der Bearbeitung sollen sie in das file zurückgeschrieben werden.

          Kommentar


          • #6
            zu 1. : schau dir glob() an
            zu 2. : mit file_get_contents() holst du den Inhalt in einem Rutsch. Dein Inhalt in ein Array packen, da musst du selber ein paar Zeilen schreiben (preg_match, explode).
            zu 3. : -
            zu 4. : Inhalt aus dem geänderten Array zusammenbauen und mit file_put_contents zurückschreiben
            PHP-Klassen auf github

            Kommentar


            • #7
              Danke werde es mir anschauen.

              zu 1.: glob() geht schon in die richtige Richtung.

              Hab mal folgenden Ansatz:

              PHP-Code:
                      $dir "$dir_hosts";

                  
              // Open a known directory, and proceed to read its contents
                  
              foreach(glob($dir) as $file
                  {
                      foreach(
              $file as $key=>$value)
                      {
                          
              $userdatei fopen("$value","r");
                          while(!
              feof($userdatei))
                             {
                                 
              $zeile[] = fgets($userdatei,1024);
                                 
              //mittels $preg_match nach "define{" suchen und nchfolgende zeilen bis } einlesen
                             
              }
                      
              fclose($userdatei);
                      }
                  } 
              Allerdings macht mir die funktion einen String daraus. Ich hätte die Daten aber gern zeilenweise in einem Array.

              Das einlesen als Array wäre ja mittels:
              PHP-Code:
                  $datei=file("$dir_hosts");
                  {
                  unset(
              $inhalt,$eintrage);
                  for (
              $i=0;$i<count($datei)+1;$i++)
                  {
                  
              $inhalt .="$datei[$i]";
                  }
                  
                  
              // Wir erzeugen einen array
                  
              $eintrage=explode('---->',$inhalt);
                  
                  for (
              $i=0;$i<count($eintrage);$i++)
                  {
                  echo 
              "$eintrage[$i]<br>";
                   } 
              möglich.

              Das Array müßte ich nur nach dem ersten aufkommen des Feldinhalts "define host {" und "}" zu suchen.

              Ich könnte mir die Arraykeys sppeichern und hätte somit bereits meinen Suchbereich eingegrenzt. Dies wäre unabhängig von der eigentlichen Position innerhalb das Datei.

              Ist es möglich mehrere "delimiter" zu definieren? Wenn man alle Schlüsselworte definieren würde, blieben lediglich die Werte zurück.

              Kommentar


              • #8
                Zitat von harrier Beitrag anzeigen
                Ich möchte gerne alle Dateien innerhalb eines Verzeichnisses mit einem PHP-Skript einlesen
                Wäre da nicht vielleicht scandir() sinnvoller als glob()?

                Wenn es ja sowieso alle Dateien aus einem bestimmten Verzeichnis sein sollen,
                also so in der Art:
                PHP-Code:
                <?php
                    $filelist 
                scandir('/pfad/zum/gewuenschten/verzeichnis');

                    foreach (
                $filelist as $file) {
                        if (
                $file == '.' || $file == '..') {
                            continue;
                        }
                        
                $content file_get_contents('/pfad/zum/gewuenschten/verzeichnis/'$file);
                        
                // Nun deine Daten aus $content filtern und nach belieben speichern
                    
                }

                Kommentar


                • #9
                  Das ist aber überaus umständlich.

                  PHP-Code:
                  $lines= [];
                  foreach(
                  glob($pathGLOB_NOSORT) as $file) {
                      
                  $lines array_merge($linesfile($file));

                  Es ist aber wohl wahrscheinlicher das du nach etwas wie diesem hier gesucht hast:
                  PHP-Code:
                  $files = [];
                  foreach(
                  glob($pathGLOB_NOSORT) as $file) {
                      
                  $files[$file] = file_get_contents($file);

                  Das obere Beispiel fast äquivalent zu deinem Code. Wie dem auch sei, bist du sicher, das du alle Zeilen aus allen Dateien in einer einzigen liste haben willst? Wenn du das später parsen willst währe es möglicherweise einfacher, jeden Block ungesplittet bearbeiten zu können(2tes Beispiel, oder dir noch besser das Beispiel aus dem Post über diesem anschauen).

                  edit:
                  Zu lahm
                  Zitat von nikosch
                  Naja, anscheinend spricht die Steckdose kein HTTP. LOL

                  Kommentar


                  • #10
                    @ suralc:

                    Ich möchte mehrere Arrays.
                    Das Array mit den Filenames wird zur Hostauswahl genutzt.

                    zusätzlich:
                    Für jeden Host soll ein eigenes Host-Array mit den Werten existieren.

                    Nach der Auswahl des Hostes werden die Daten aus dem entsprechenden Host-Array in die entsprechenden Textfelder übertragen.

                    Wenn ich es richtig sehe gibt mir die erste Schleife die filenames in einem Array aus oder liege ich da falsch?

                    Kommentar


                    • #11
                      Hy Community,

                      das Auslesen der Dateinamen habe ich aktuell über die folgende Funktion realisieren können:

                      PHP-Code:
                              $dir '/opt/omd/sites/grn/etc/nagios/conf.d/objects';

                              
                      $string='host{';
                              echo 
                      "filelist: \n";

                              foreach (
                      glob("$dir/*") as $file)
                              {

                              
                      $content file_get_contents("$file");

                              if (
                      strpos($content$string) !== false)
                              {
                              echo 
                      "$file \n ";
                              }

                      Aktuell habe ich noch folgende Probleme zu lösen:

                      1. Der Suchpfad soll teilweise variabel sein.
                      (/opt/omd/sites/$dir/etc/nagios/conf.d/objects)

                      2. Wie kann ich die suche rekursiv über alle Verzeichnisse laufen lassen?

                      3. Wenn die Zeile in welcher der String gefunden wurde mit '#' beginnt soll die Datei bei der Ausgabe ignoriert werden.

                      Kommentar


                      • #12
                        Zitat von harrier Beitrag anzeigen
                        2. Wie kann ich die suche rekursiv über alle Verzeichnisse laufen lassen?
                        Das kannst du mit Iteratoren realisieren. Als Ansatz:
                        PHP-Code:
                        $path ".";
                        $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path,FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);
                        foreach(
                        $it as $file) {
                            if(!
                        $file->isDir()) { 
                                echo 
                        $file->__toString()."<br>";
                            } 

                        PHP-Klassen auf github

                        Kommentar


                        • #13
                          2. Wie kann ich die suche rekursiv über alle Verzeichnisse laufen lassen?
                          Indem Du das Filesystem rekursiv durchläufst
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            @jspit:
                            habe deine Vorschlag umgesetzt und das Auslesen der Filenames funktioniert.
                            Hätte noch ein paar Frage zur Funktionsweise der Iteratoren.
                            -ist die Variable $file ein String welchen ich regulär in ener Datei ausgeben kann?


                            Habe noch eine Suchoption eingebaut, dass nur File welche einen bestimmten String enthalten ausgelesen werden.

                            PHP-Code:
                            <?php

                            <form action="host.php" method="post">
                            <
                            p><select name="hostname">
                            for (
                            $i=0$i count($file); $i++)
                            {
                                <
                            option value="$file[$i]"$file[$i] </option>
                            }
                            </
                            select></p>
                            <
                            p> <input type="submit" />
                            </
                            form>


                            class 
                            Host extends Main
                            {

                                private 
                            $file;
                                private 
                            $sitename;    
                                private 
                            $string;
                                private 
                            $dir;
                                
                                function 
                            read_cfg($sitename)  
                                {
                                    
                                
                            $path "/opt/omd/sites/grn/etc/nagios/conf.d/objects";

                                
                            //ignored File Extensions:
                                
                            $string='host{';
                                
                            $string1='.bak';
                                
                            $string2='.tmp';
                                
                            $string3='.inaktiv';
                                
                            $string4='.inactiv';
                                
                                echo 
                            "filelist \n ";

                                
                            $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path,FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);  //liefert Array
                                
                            foreach($it as $file)
                                {
                                    if(
                            $file->isFile())
                                    {
                                if(
                            strpos($file$string1) !== false)
                                {
                                    if(
                            strpos($file$string1) !== false)
                                {
                                    if(
                            strpos($file$string2) !== false)
                                {
                                    if(
                            strpos($file$string3) !== false)
                                {
                                    if(
                            strpos($file$string4) !== false)
                                {
                                        
                            $content file_get_contents("$file"); 
                                    if (
                            strpos($content$string) !== false)
                                        {
                                            echo 
                            $file->__toString();
                                                echo 
                            "\n";
                                                    return 
                            $file;
                                    }
                                }
                                }
                                    }    
                                }
                                }
                                }
                                }

                            }
                            ?>

                            </body>
                            </html>
                            Bin momentan noch am Suchen von zwei weiteren Optionen.
                            1. bestimmte Dateiendungen (*.bak) sollen ausgelassen werden.
                            - Habe mir überlegt vor "$content = file_get_contents("$file");" eine weiteres if zu definieren welches nur dateien ohne die definierte Endung betrachtet.

                            2. Momentan wird der komplette Pfad zur Datei mit ausgegeben:
                            Bsp.: (/opt/omd/sites/test/etc/nagios/conf.d/objects/Testrechner/test-cfg.inaktiv)
                            Der Pfadteil "/opt/omd/sites/test/etc/nagios/conf.d/objects/" ist fix. lediglich dahinter können sich "keine", "ein" oder "mehrere" Verzeichnissebenen befinden.
                            Ist es möglich den fixen Pfadteil vor der Ausgabe zu löschen und danach im übrigen Teil mittels Schleife nach "/.../" suchen und diese auch zu löschen?

                            Kommentar


                            • #15
                              zu 1.
                              $file ist ein Objekt der SplFileInfo class, dessen Eigenschaften und Methoden du hier nutzen kannst.
                              zu 2.
                              Verstehe dein Anliegen nicht so richtig. Der komplette (absolute) Pfad ist doch ok.
                              Wozu den 'fixen Pfadteil' löschen?
                              Wenn es nur um die Optik bei der Ausgabe geht, dann kann man mit str_replace was machen.

                              Am Rande:
                              PHP-Code:
                              $content file_get_contents("$file"); 
                              Die Double Quotes sind für solche Fälle überflüssig.
                              PHP-Klassen auf github

                              Kommentar

                              Lädt...
                              X