Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] fopen & fgetcsv : immer aktuellste Datei?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] fopen & fgetcsv : immer aktuellste Datei?

    Moin liebe Mituser,

    ich habe eine Frage bzgl. der fopen Funktion.
    Auf meinen Server wird stündlich eine neue .csv Datei automatisch hochgelanden, die ich mit fgetcsv auslese.

    Nun hat die Datei immer einen wechselnden Namen im Format:
    Name_YYYYMMDD_HHSSPPPP.csv - wobei Name immer gleich ist nur die Zeitangabe wechselt.
    z.B: Name_20100803_11402314.csv

    Kann man irgendwie sagen, dass jeweils die aktuellste Datei ausgelesen wird?

    $fp = fopen ("daten/Name_20100803_11402314.csv","r");

    while ($data = fgetcsv ($fp, 9000, ";" )) {
    if ($data[0] == $_POST["fach"]) {


    Vielen Dank.


  • #2
    Das Verzeichis durchlaufen und per mtime (ctime?) die neueste Datei ermitteln...

    Der Dateiname ist eher ein Hinweis - die Zeit der Erzeugung / letzten Änderung ist entscheidend.
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Danke erstmal. Hab mir jetzt aber 2,5 stunden die finger wund gesucht und rumprobiert - ich schaffe es nicht.

      wie bekomme ich die neueste Datei raus?

      <?php

      $row = 1;

      foreach (glob("daten/*.csv") as $aktuelledaten)

      $fp = fopen ( $aktuelledaten , "r" );

      while ($data = fgetcsv ($fp, 9000, ";" )) {
      if ($data[0] == $_POST["Spalte1"]) {

      echo " <table border='1'><tr><td>";
      echo " Wert Spalte 1: <td>" . $data[0] . "<br /><tr><td>";

      }
      $row++;
      }
      fclose ($fp);
      ?>

      Kommentar


      • #4
        Bitte [php] Tags verwenden
        PHP-Code:
        <?php

        $row 
        1;

        foreach (
        glob("daten/*.csv") as $aktuelledaten)

        $fp fopen $aktuelledaten "r" );

        while (
        $data fgetcsv ($fp9000";" )) {
            if (
        $data[0] == $_POST["Spalte1"]) {

              echo 
        " <table border='1'><tr><td>";
              echo 
        " Wert Spalte 1: <td>" $data[0] . "<br /><tr><td>";
              
            }
            
        $row++;
        }
        fclose ($fp);
        ?>
        glob() ist schonmal gut. Damit findest du alle Dateien, die auf .csv enden.
        So, nun schaust du dir im Manual filectime() bzw. filemtime() an, die liefern dir den Timestamp der Dateierzeugung (ctime) bzw. den Zeitpunkt der letzten Änderung (mtime). Dann ermittelts du das aktuelle Maximum und merkst dir, welcher Dateiname das war... Am Ende der Schleife bleibt exakt eine Datei übrig - die mit der neuesten ctime/mtime.
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Hey, sag mir mal bitte, ob das so ungefähr der richtige Weg ist. Fgetcvs nimmt immernoch nicht die neueste datei, aber viel kann doch nicht mehr fehlen, oder?

          Danke.


          PHP-Code:
          <?php

          $row 
          1;

          foreach (
          glob("daten/*.csv") as $aktuelledaten) {
              
          $cvss[filectime($aktuelledaten)] = $aktuelledaten;
          max($cvss);

          foreach (
          $cvss as $timestamp => $aktuelledaten) {

          $fp fopen $aktuelledaten "r" );

          while (
          $data fgetcsv ($fp9000";" )) {
              if (
          $data[0] == $_POST["Spalte1"]) {

                echo 
          " <table border='1'><tr><td>";
                echo 
          " Daten Spalte1: <td>" $data[0] . "<br /><tr><td>";
                
              }
              
          $row++;
          }
          }
          fclose ($fp);
          ?>

          Kommentar


          • #6
            Zitat von creeki Beitrag anzeigen
            Hey, sag mir mal bitte, ob das so ungefähr der richtige Weg ist. Fgetcvs nimmt immernoch nicht die neueste datei
            Nein - mit der foreach-Schleife „nimmt“ es alle, nacheinander.

            Wenn du nur am aktuellsten Eintrag in deinem Array interessiert bist - dann verarbeite auch nur den, und nicht alle.


            (Zumal der gezeigte Code auch noch in der Hinsicht unsinnig ist, dass du die Dateien innerhalb der Schleife öffnest, aber erst danach fclose benutzt.)

            Kommentar


            • #7
              Problem in deinem Code ist: Du verwendest als Schlüssel die Create-Time der Datei, es könnte aber sein, das 2 Dateien zur gleichen Zeit erzeugt wurden. Lieber den Dateinamen als Schlüssel und die ctime als Wert.. dann klappt auch max() am Ende.

              Aber eigentlich dachte ich eher so (in diesem Zusammenhang war der Hinweis auf max() nicht 100% richtig, sorry):

              PHP-Code:
              <?php
              $max_ctime 
              0;
              $newest_file null;
              foreach (
              glob("daten/*.csv") as $aktuelledaten) {
                  
              $curr_ctime filectime($aktuelledaten);
                  if (
              $curr_ctime $max_ctime ) {
                      
              $max_ctime $curr_ctime;
                      
              $newest_file $aktuelledaten;
                  }
              }
              // jetzt sollte $newest_file den Dateinamen der Datei enthalten, die zuletzt erzeugt wurde.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Die überhaupt in ein Array zu hauen, wenn man nur an einer einzigen Datei interessiert ist, ist doch schon Unfug.

                Pseudocode:
                Code:
                aktuellsterTimestamp = -1;
                schleife_ueber(alle_dateien) {
                  if(timestamp_aktueller_Datei > aktuellsterTimestamp) {
                    aktuellsterTimestamp = timestamp_aktueller_datei;
                    neueste_datei = name_aktueller_datei;
                  }
                }
                echo neueste_datei;

                Kommentar


                • #9
                  Vielen Dank euch beiden - es funktioniert
                  hier nochmal der ganze code:

                  PHP-Code:
                  <?php

                  $max_ctime 
                  0;
                  $newest_file null;
                  foreach (
                  glob("daten/*.csv") as $aktuelledaten) {
                      
                  $curr_ctime filectime($aktuelledaten);
                      if (
                  $curr_ctime $max_ctime ) {
                          
                  $max_ctime $curr_ctime;
                          
                  $newest_file $aktuelledaten;
                      }
                  }

                  $row 1;
                  $fp fopen $newest_file "r" );

                  while (
                  $data fgetcsv ($fp9000";" )) {
                      if (
                  $data[0] == $_POST["Spalte1"]) {

                        echo 
                  " <table border='1'><tr><td>";
                        echo 
                  " Spalte1: <td>" $data[0] . "<br /><tr><td>";
                        echo 
                  " Spalte2: <td>" $data[1] . "<br /><tr><td>";
                        echo 
                  " Spalte3: <td>" $data[2] . "<br /><tr><td>";
                        echo 
                  " Spalte4: <td>" $data[3] . "<br /><tr><td>";
                        echo 
                  " Zeit der letzten Dateiänderung : <td>" strftime("%F"." "."%T",filemtime$newest_file )) . "</table>";
                      }
                      
                  $row++;
                  }

                  fclose ($fp);

                  ?>
                  habt ihr sonst noch Verbesserungsvorschläge?
                  was war das mit dem sinnlosen fclose am schluss?

                  Kommentar


                  • #10
                    Zitat von creeki Beitrag anzeigen
                    was war das mit dem sinnlosen fclose am schluss?
                    Sinnlos?
                    Du öffnest eine Datei, also solltest du sie auch schliessen. Zwar räumt das Laufzeitsystem Resourcen nach Scriptbeendigung ab, aber es gehört zum guten Ton, seine Resourcen richtig zu verwalten. Stell dir einfach vor, du hälst die Datei in diesem Script offen und rufst eine weitere Funktion auf, die mit genau dieser Datei arbeiten will. Im ungünstigsten Fall schlägt das fehl, weil die Datei nicht geöffnet/gelesen/geschrienen werden kann.
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar

                    Lädt...
                    X