Ankündigung

Einklappen
Keine Ankündigung bisher.

Länge eines fgetcsv-arrays herausfinden

Einklappen

Neue Werbung 2019

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

  • Länge eines fgetcsv-arrays herausfinden

    Hallo,

    ich benutze fgetcsv um aus einem Export unserer Zeiterfassung mein Berichtsheft zu generieren. Das funktioniert soweit gut, mein Problem ist nur dass ich jetzt die Seitenzahlen automatisch generieren will. Eine "Seite" besteht aus >29 Zeilen, die ich ausgebe, wonach ein Trennelement (aka "neue Seite") eingefügt wird.

    Die $seitenanzahl wäre also floor($rows_in_csv / 30).
    Wie aber bekomme ich die $rows der csv heraus, da ja immer nur eine Zeile der CSV ausgelesen (und in meinem Fall in ein Array geschrieben) wird.

    Ich wollte vermeiden die CSV vor dem eigentlichen Auslesen und zeilenweise ausgeben noch einmal nur zum Herausbekommen der rows erneut einzulesen.

    Danke für Tipps und Hilfestellungen!
    Beste Grüße,
    Noël

  • #2
    Zitat von Noel Beitrag anzeigen
    Ich wollte vermeiden die CSV vor dem eigentlichen Auslesen und zeilenweise ausgeben noch einmal nur zum Herausbekommen der rows erneut einzulesen.
    Geht nicht.

    PHP kann nicht hellsehen wie viele Zeilen das Ding hat, du wirst es also schon vorher komplett einlesen müssen.

    Kommentar


    • #3
      Und wo ist das Problem, beim Ausgeben der Datensätze, was ja wohl höchstvermutlich in einer Schleife geschehen wird, einfach eine Zählvariable mitlaufen zu lassen?

      Kommentar


      • #4
        Zitat von ChrisB Beitrag anzeigen
        Und wo ist das Problem, beim Ausgeben der Datensätze, was ja wohl höchstvermutlich in einer Schleife geschehen wird, einfach eine Zählvariable mitlaufen zu lassen?
        Das Problem liegt da, dass ich die Datensätze ausgebe - Reihe für Reihe - und dann natürlich mitzählen kann, und am Ende eine Zahl habe die ich aber nirgends mehr einsetzen kann weil die Ausgabe dann schon passiert ist. Die Variable muss in einen String, der wiederrum HTML für Tabellenkopf und Fuß enthält, und immer nach 30 Zeilen eingefügt wird als Seitenumbruch (das ganze soll ja gedruckt werden).

        Ich bräuchte die Zahl also am Anfang um sie dann per $head_r str_replace('_seitenanzahl_','$seitenanzahl',$head ) immer im
        Tabellenkopf-String zu ersetzen und diesen auszugeben.

        Zitat von Dark Guardian
        Geht nicht.

        PHP kann nicht hellsehen wie viele Zeilen das Ding hat, du wirst es also schon vorher komplett einlesen müssen.
        Ich dachte es gäbe eine andere Lösung, quasi ein countcsv() oder so. Danke trotzdem, dann muss ich wohl den ressourcenfressenden Weg gehen.

        Beste Grüße,
        Noël

        Kommentar


        • #5
          Erzeug beim einlesen dein Array und zähl es danach mit count()..?

          Kommentar


          • #6
            Du musst ceil() benutzen, also aufrunden, wenn du die Seiten ermitteln willst.

            Dein Problem löst du ganz einfach dadurch, dass du die Eingabe (CSV-Import) von der Verarbeitung bzw. Ausgabe (Stückelung in Paginating) trennst: EVA-Prinzip. Wie schon erwähnt: CSV einlesen in einen Array, Paginating anwenden, Ausgeben.

            Kommentar


            • #7
              PHP-Code:
              $anzahl_zeilen countfile($dateiname) ); 

              Kommentar


              • #8
                belegt aber den Platz, wolla .. dann lieber wie chriz und troy vorschlagen ..

                Einlesen mit fgetcsv in array .. Array-Elemente der obersten Ebene (=Zeilen) mit count zählen und damit die Pagination aufbauen und dann ausgeben - fertig der Lack

                Kommentar


                • #9
                  Zitat von eagle275 Beitrag anzeigen
                  belegt aber den Platz, wolla .. dann lieber wie chriz und troy vorschlagen ..

                  Einlesen mit fgetcsv in array .. Array-Elemente der obersten Ebene (=Zeilen) mit count zählen und damit die Pagination aufbauen und dann ausgeben - fertig der Lack
                  Läuft im Prinzip doch auf das gleiche hinaus, nur das der Speicher nur einmal belegt wird.

                  Dafür muss er zweimal über alle Datensätze iterieren (1x mit fgetcsv, und 1x foreach für die Ausgabe). Mit der vorgeschlagenen Lösung von Wolla nur einmal, belegt den Speicher aber doppelt.

                  Ob nun Zeit und Speicher überhaupt relevant sind wissen wir ja nicht einmal. Ich denke nicht da er sein Berichtsheft wohl auf einer XAMP Umgebung generieren wird. Da ist übersichtlicher Code (also nur eine Schleife) ggf. eher von Vorteil.

                  Kommentar


                  • #10
                    sehr witzig , Dark .. und count(file()) ? .. das iteriert auch einmal über die Datei UND belegt den Speicher - möglicherweise läuft es dabei um Bruchteile schneller als fgetcsv ..

                    Aber richtig .. im Grunde wird es wohl bei Realistischem Umfang des Berichtshefts keine große Rolle spielen - und richtig .. wolla's Code erhöht etwas die Übersicht

                    Kommentar


                    • #11
                      Zitat von eagle275 Beitrag anzeigen
                      sehr witzig , Dark .. und count(file()) ? .. das iteriert auch einmal über die Datei UND belegt den Speicher - möglicherweise läuft es dabei um Bruchteile schneller als fgetcsv ..
                      Schon, aber file() dürfte dank seiner C Implementierung schneller sein als das interpretierte Script.

                      Alternativ ginge es ja auch immernoch so:
                      PHP-Code:
                      $lines file('csv');
                      $countLines count($lines);
                      foreach (
                      $lines AS $line) {
                         
                      $fields explode(';'$line);
                         .....

                      Irgendwie interessiert es mich grad echt was die performanteste Lösung ist. XD

                      Kommentar


                      • #12
                        Das ist doch Unsinn.

                        file() und fgetcsv() liefern doch überhaupt nicht die selben Ergebnisse. fgetcsv() kann auch Datensätze verarbeiten, in denen Zeilenumbrüche vorkommen. count(file($datei)) kann das nicht, gibt also potentiell zu viele Zeilen aus.

                        Gruß Jens

                        Kommentar


                        • #13
                          PHP-Code:
                          $fields explode(';'$line); 
                          Das funktioniert dann nicht, wenn die Felder in Doppelhochkommas eingepackt sind.

                          Jens: Schdümmd - wenn eins der in "" eingeschlossenen Felder Zeilenumbrüche hat, dann scheitert file().

                          Also muss man doch vielleicht so was machen:
                          PHP-Code:
                          $datei = array();
                          $fp_in fopen$filename"r" );
                          while (
                          $teile fgetcsv($fp_in2048,";")) {
                            
                          $datei[] = $teile;
                          }
                          fclose($fp_in);

                          // Jetzt $datei verarbeiten.
                          foreach ( $datei as $zeilennummer => $zeile ) {
                            foreach ( 
                          $zeile as $feld ) {
                              
                          machwas();
                            }

                          Das lädt die Daten nur einmal ein, und man hat die Anzahl der Zeilen in count($datei).

                          Kommentar


                          • #14
                            Wenn sowieso nicht die kompletten Daten ausgegeben werden sollen, sondern über eine Blätterfunktion immer nur ein bestimmter Ausschnitt - dann ist es nicht sonderlich performant, die kompletten Daten in ein Array einzulesen.

                            Es reicht aus, nur die Daten ins Array zu speichern, die man in diesem Durchlauf tatsächlich ausgeben will - die Datensätze davor und danach können einfach „überlesen“ werden, in dem man in diesen Fällen das Ergebnis von fgetcsv „wegwirft“, und nur den Zeilenzähler erhöht.

                            Kommentar


                            • #15
                              Zitat von Wolla Beitrag anzeigen
                              PHP-Code:
                              $fields explode(';'$line); 
                              Das funktioniert dann nicht, wenn die Felder in Doppelhochkommas eingepackt sind.
                              Die ließen sich wegtrimmen...

                              Der Einwand von Jens ist allerdings brechtigt.

                              Kommentar

                              Lädt...
                              X