Dateiarbeit mit *.csv

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

  • Dateiarbeit mit *.csv

    Hallo

    Ich habe ein Problem:

    Ich wollte ein kleines Statistik - Script schreiben, welches den Seitentitel einer Internetseite und die Anzahl der Zugriffe in eine Datei schreibt.
    Beim nächsten Aufruf soll die Zugriffszahl in der richtigen Zeile erhöht werden und wieder gespeichert werden.
    Soweit funktioniert das ganze ja auch.
    Aber wenn das Script auf einer Seite ausgeführt wird, deren Seitentitel noch nicht in der Datei steht, soll eine neue Zeile mit dem neuen Seitentitel und einer null angefügt werden.
    Dabei kommen allerdings die schlimmsten Ausdrucke in der Datei zustande.
    Nach dem 3. Aufruf stimmt dann alles, aber vorher stehen 2 Zeilen Müll in der Datei.

    Kann mir bitte irgendwer helfen?

    Hier jetzt das Script:

    PHP-Code:
    <?php


       $fn 
    "test.csv";
       
    $stri $titel;
       
    $erg 0;
       
    $z 0;
       
    $s 0;
       
    $x 0;
       
    $y 0;

      if (
    file_exists($fn))
       {


       
    //Datei auslesen
            
    $inhaltdat file($fn);


       
    // Wert und Position suchen
          
    for($x=0;$x<count($inhaltdat);$x++)
          {
               
    $inh explode("#",$inhaltdat[$x]);
               for(
    $y=0;$y<count($inh);$y++)
               {
                if (
    $inh[$y] == $stri)
                {
                     
    $z $x;
                     
    $s $y;
                     
    $erg 1;
                 }
                }
          }

      if (
    $erg == 0)
      {
      
    $nl chr(13) . chr(10);
      
    $string "$titel#0$nl";
          
    array_push($inhaltdat,$string);
          }


    // Wert im Array aendern
          
    $inh[1] = $inh[1] + ;
          
    $inhaltdat[$z] = implode("#",$inh);

    // Datei loeschen
       
    unlink($fn);

    // Werte in Datei schreiben
       
    $fp fopen($fn,"w");
       
    flock($fp,2);
       for(
    $x=0;$x<count($inhaltdat);$x++)
          {
           
    fputs($fp,$inhaltdat[$x]);
           }
       
    flock($fp,3);
       }


    ?>

  • #2
    Dabei kommen allerdings die schlimmsten Ausdrucke in der Datei zustande.
    Definiere.

    Kommentar


    • #3
      Beim ersten Aufruf steht folgendes in der Datei: #1Das ist mein Test#0
      Beim zweiten Aufruf:
      #2#0
      #1Das ist mein Test#0
      Das ist mein Test#0

      Beim dritten wird der Zähler in der letzten Zeile erhöht. usw.
      Es sollte aber schon beim ersten Aufruf nur die letzte Zeile in der Datei stehen.

      Kommentar


      • #4
        haste mal testausgaben gemacht, um den fehler einzugrenzen?

        Kommentar


        • #5
          Ich habe viel probiert, aber nichts konkretes gefunden.
          Ich denke, dass der Fehler vielleicht irgendwo zwischen Zeile 38 und 40 liegt, habe aber keine Ahnung warum.

          Kommentar


          • #6
            Ich hab grad kein PHP-System zur Hand, folgendes Script ist also mit ziemlicher Sicherheit buggy - bitte selbst testen.

            PHP-Code:
            <?php
            $fn 
            "test.csv";
            $div "#";

            if (!
            file_exists($fn)) die("Datei $fn existiert nicht!");

            //Datei auslesen
            $inhalt file_get_contents($fn);

            // Titel suchen
            $offset strpos($inhalt$titel.$div) + strlen($titel.$div);

            // Inhalt ändern
            if ($offset === FALSE)
              
            $inhalt .= $titel."#1#".chr(13).chr(10);
            else {
                
            $next_div strpos($inhalt$div$offset);
                
            $anzahl substr($inhalt$offset$next_div-$offset);
                
            $suffix substr($inhalt$next_div);
                
            $inhalt substr($inhalt0$offset).($anzahl+1).$suffix;
            }

            // zurückschreiben
            file_put_contents($fn$inhalt);
            ?>
            Das hat nicht mehr viel mit deinem Ansatz gemein, aber der ist imho ein Kanonenschuß auf einen Spatz. Mit Arrays hantieren lohnt sich hier nämlich nur, wenn du tausende Datensätze haben wirst. (Lexikografisch sortiert -> schneller Zugriff)

            Beachte, dass obiges Script kein Locking enthält!

            Kommentar


            • #7
              Danke onemorenerd,

              aber ich wollte schon mein Ansatz mit Arrays verwenden( soll auch für größere Sites sein).
              Vielleicht hilft es mir aber trotzdem!

              Kommentar


              • #8
                Okay, verstehe. Muß es denn unbedingt CSV sein; ständig? Denn mit un/serialize() gehts schneller und wenn die Titel die Arraykeys sind, hast du mit drei Zeilen das Script komplett.
                PHP-Code:
                $inhalt unserialize(file_get_contents($fn));
                $inhalt[$titel] = $inhalt[$titel] + 1;
                file_put_contents($fnserialize($inhalt)); 
                Für den Export könnte man den Array nach dem Einlesen mittels fputcsv() ausgegeben.

                Kommentar


                • #9
                  wenns auch für größere seiten sein soll, dann wirst du mit ner txt-datei schnell an deine Grenzen stoßen. Da brauchst wahrscheinlich ne SQL-anbindung.

                  Kommentar


                  • #10
                    Vielen Dank für eure Hilfe,

                    die Idee den Titel als Key für das Array zu nehmen ist wirklich gut, doch löst mein Problem auch nicht.
                    Ich will mehrere Informationen über eine Seite wirklich in eine Zeile schreiben und mehrere Zeilen (für mehrere Seiten) in eine Datei.
                    Das ist mein Problem, wie ich oben schon sagte, funktioniert das ja auch, nur nicht wenn eine neue Seite (Zeile) hinzukommt.

                    Habt ihr denn irgendeinen Fehler in meinem Script gefunden, der den obengennanten Fehler hervorruft?
                    Bitte guckt es euch noch mal an!

                    Kommentar


                    • #11
                      Re: Dateiarbeit mit *.csv

                      PHP-Code:
                         ....

                         
                      // Wert und Position suchen
                        
                      for($x=0;$x<count($inhaltdat);$x++) {
                          
                      $inh explode("#",$inhaltdat[$x]);
                          for(
                      $y=0;$y<count($inh);$y++) {
                            if (
                      $inh[$y] == $stri) {
                              
                      $z $x;
                              
                      $s $y;
                              
                      $erg 1;
                            }
                          }
                        }

                        if (
                      $erg == 0) { ... }

                        
                      // Wert im Array aendern
                        
                      $inh[1] = $inh[1] + ;
                        
                      $inhaltdat[$z] = implode("#",$inh);

                        .... 
                      Überlege mal, was $inh enthält, nachdem die FOR-Schleife durch ist und das IF-Statement nicht betreten wurde (weil der Titel gefunden wurde). Ja richtig, die letzte Zeile deiner Datei. Das ist aber nicht unbedingt die, in der du den Zähler erhöhen willst.
                      Ändere den Zähler besser direkt in dem Moment, in dem du ihn findest. Also in der inneren Schleife.

                      Alle Angaben ohne Gewähr, ich kann deine Motivation, diesen Weg zu gehen, nicht nachvollziehen. Besser wäre ein Array von Arrays, etwa so:
                      PHP-Code:
                      daten = array(
                        
                      'titel1' => array('anz''foo''bar'),
                        
                      'titel2' => array('bla''blub'),
                        ....
                        
                      'titeln' => array('fin')
                      ); 
                      Diesen mit un/serialize() behandeln und du wirst dein Script auch in einem Jahr noch verstehen.

                      Kommentar


                      • #12
                        Hallo,

                        ich habe es endlich geschafft!
                        Das Script funktioniert jetzt so wie es soll ohne Probleme.
                        Hier jetzt die fertige Version:

                        PHP-Code:
                        <?php


                           $fn 
                        "test.csv";
                           
                        $stri $titel;
                           
                        $erg 0;
                           
                        $z 0;
                           
                        $s 0;
                           
                        $x 0;
                           
                        $y 0;

                          if (
                        file_exists($fn))
                           {


                           
                        //Datei auslesen
                                
                        $inhaltdat file($fn);


                           
                        // Wert und Position suchen
                              
                        for($x=0;$x<count($inhaltdat);$x++)
                              {
                                   
                        $inh explode("#",$inhaltdat[$x]);
                                   for(
                        $y=0;$y<count($inh);$y++)
                                   {
                                    if (
                        $inh[$y] == $stri)
                                    {
                                         
                        $z $x;
                                         
                        $s $y;
                                         
                        $erg 1;
                                     }
                                    }
                              }

                          if (
                        $erg == 0)
                          {
                          
                        $nl chr(13) . chr(10);
                          
                        $string "$titel#0#$nl";
                              
                        array_push($inhaltdat,$string);
                           
                        $z=(count($inhaltdat)-1);
                              }


                        // Wert im Array aendern
                                
                        $inh explode("#",$inhaltdat[$z]);
                              
                        $inh[1] = $inh[1] + ;
                              
                        $inhaltdat[$z] = implode("#",$inh);

                        // Datei loeschen
                           
                        unlink($fn);

                        // Werte in Datei schreiben
                           
                        $fp fopen($fn,"w");
                           
                        flock($fp,2);
                           for(
                        $x=0;$x<count($inhaltdat);$x++)
                              {
                               
                        fputs($fp,$inhaltdat[$x]);
                               }
                           
                        flock($fp,3);
                           }


                        ?>

                        Kommentar


                        • #13
                          Vielleicht geht es auch so

                          Ich glaube dein Problem hättest du auch mit einem break hinter $erg=1; lösen können!

                          Kommentar


                          • #14
                            Warum arbeitest du eigentlich nicht mit fgetcsv() und fputcsv()? Die Funktionen gibts ja nicht aus reinem Jux.

                            Kommentar


                            • #15
                              @kladih Meinst du, dass ihn das nach 8 Jahren noch interessiert? Immer diese Leichenschänder
                              gruss Chris

                              [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

                              Kommentar

                              Lädt...
                              X