Sven: CSV-Datei auslesen

Hi,

ich würde gerne aus einer CSV-Datei mit 1500 Zeilen und 2 Spalten, immer eine Zeile per Zufall auslesen. Es handelt sich dabei um eine Zitatesammlung...

In Spalte 1 steht der Autor, in Spalte 2 das Zitat.

Kann mir jemand den PHP-Code dafür nennen?

  1. Moin!

    Kann mir jemand den PHP-Code dafür nennen?

    Wie sehen denn die Ergebnisse Deiner bisherigen Bemühungen aus?
    Welche Fehler oder Probleme traten auf? Woran hakt es genau?

    -> hier ist SELF-HTML, nicht GET-SCRIPT( http://www.getscript.com )

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    1. Gemein

      Ja, ich hab so wenig dazu zu sagen

    2. Moin!

      Kann mir jemand den PHP-Code dafür nennen?
      Wie sehen denn die Ergebnisse Deiner bisherigen Bemühungen aus?
      Welche Fehler oder Probleme traten auf? Woran hakt es genau?

      -> hier ist SELF-HTML, nicht GET-SCRIPT( http://www.getscript.com )

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      Hi,

      ich hatte es mit folgendem Script probiert:

      <?php
       $row = 1;
       $handle = fopen ("zitate.csv","r");
       while ( ($data = fgetcsv ($handle, 1000, ",")) !== FALSE ) {

      $num = count ($data);
        print "<p> $num fields in line $row: <br>\n";
        $row++;

      for ($c=0; $c < $num; $c++) {
         print $data[$c] . "<br>\n";
        }
       }
       fclose ($handle);
      ?>

      Damit liest er auch die ganzen Zitate aus, allerdings alle.
      Wie kann ich da jetzt nur eins per Zufall auslesen?

      1. Moin!

        Hm. der von Dir gegangene Weg ist ineffektiv.
        Nimm zum Lesen der Daten die funktion file()

        Info: http://de.php.net/manual/de/function.file.php

        Diese liest den Text zeilenweise in ein Array.

        Mit rand() ermittelst Du eine Zufallszahl, Du kanns die kleinste und größte mögliche Zahl bestimmen.
        In Deinem Fall wären das 0 und 1499 oder einfach Die Anzahl der Elemente im Array -1 (liefert count()).
        Info: http://de.php.net/manual/de/function.rand.php
        Info: http://de.php.net/manual/de/function.count.php
        Dann musst Du den Inhalt der Zeile spalten. Mit CSV meinst Du sicher eine mit Semikolon separierte Datei. Das macht split(), list() kann dann die Daten aus dem Array Variablen zuweisen.
        Info: http://de.php.net/manual/de/function.split.php

        <?
        $strDatei  = "statistik.csv";
        $arDatenmenge = file($datei);
        $intZufall     = rand(0, count($arDatenmenge)-1 );
        $strDatensatz  = $sarDatenmenge[$intZufall];
        list($strAutor, $strText) = split(';', $strDatensatz);
        unset($arDatenmenge);                                  // Speicher sparen :)
        echo "$strAutor schrieb $strText";
        ?>

        Eventuell musst Du noch die Textbegrenzer strippen. Aber ich kenne ja das Format Deiner CSV- Datei nicht. Definiert ist CSV jedenfalls nicht.

        Hier ein Ansatz mit fgetcsv: ich habe das Beispiel aus:
        http://de.php.net/manual/de/function.fgetcsv.php ergänzt.

        <?php
        $intZufall     = rand(0,1499);                 //
        $row = 1;                                      // Anzahl der Arrays
        $handle = fopen ("test.csv","r") or die ("test.csv konnte nicht geöffnet werden"); // Datei zum Lesen öffnen
        while (
                ( ($data = fgetcsv ($handle, 10000, ';')) !== FALSE )
          AND
                ( $num < 1499)
              )

        // solange daten übernommen werden können und $row < 1499 ist.
        // Daten werden aus der Datei in ein Array $data gelesen

        if ($row == $intZufall) {
              $strAutor = $data[0];
              $strText  = $data[1];
              $num = 1500;                             // Abbruch der Schleife!
           } // end if

        } // end while
        fclose ($handle);

        echo "$strAutor - $strText";

        ?>

        Die Beispiele sind natürlich ungetestet, können also Syntaxfehlerchen enthalten.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
        1. Hello,

          Wenn es sich um eine echte CSV-Datei handelt kann man die mit file() nicht sauber einlesen.
          Die Datenfelder in der Zeile dürfen bei CSV auch selber Zeilenumbrüche enthalten. File würde diese als Satzende interpretieren. Und dann wäre die ganze Ausgabe durucheinander.

          Sven sollte hier mal im Archiv suchen nach meinem letzten Traktat über CSV.

          Für diesen Anwendungsfall sollte das Dateiformat auf Random Access umgestellt werden. Da ist dann jeder Datensatz direkt ansprechbaar und die Probleme sind erledigt. Allerdings hat man dann das Problem des "vergeudeten" Speicherplatzes. Kommt also auf den Unterschied zwischen kürzestem und längsten Zitat an. Wenn der zu groß wird, bleibt nur eine Blockstruktur mit Indexfile.

          Wie das mit Random Access geht, kann Sven im Beispiel für die Adressverwaltung unter
          http://selfhtml.bitworks.de nachsehen.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
  2. Hello,

    ich würde gerne aus einer CSV-Datei mit 1500 Zeilen und 2 Spalten, immer eine Zeile per Zufall auslesen. Es handelt sich dabei um eine Zitatesammlung...

    CSV-Dateien sind von ihrem Typ her für Zufallszugriffe nicht prädestiniert.

    Man könnte natürlich einen zufälligen Zugiff definieren, dann versuchen, bis zum Zeilenende zu lesen und die nächste Zeile als gewünschtes Ergebnis auslesen. Das erfordert aber eine eine Funktion anstelle des ersten fgetcsv(). Das zweite ist dann schon mit der Standardfunktion durchführbar.

    Wenn Du hier im Archiv nach meinen Beiträgen bezüglich fgetcsv() suchst, weißt Du mehr

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  3. Hallo,

    ich würde gerne aus einer CSV-Datei mit 1500 Zeilen
    und 2 Spalten, immer eine Zeile per Zufall auslesen.
    In Spalte 1 steht der Autor, in Spalte 2 das Zitat.

    als erster Ansatz hier mal ein einfaches Skript (s.u., ungetestet!), daß per Zufall Zitate aus einer Textdatei ausliest, die durch Separatorzeichen getrennt sind.

    Vorteile gegenüber CSV: Leichter zu editieren, Zeilenumbüche im Textfile werden auch bei der Ausgabe als Zeilenumbüche dargestellt.

    Wenn es unbedingt ein CSV-File sein soll, musst Du das Skript entsprechend ergänzen bzw. abändern ...

    Grüße,

    Sebastian

    <?php

    // quotes file
    $quotes_file = 'quotes.txt';

    // separators
    $separator_1 = '*';
    $separator_2 = '#';

    // ----------------------------------------------------------------------

    // seed the random number generator
    srand((double)microtime()*1000000);

    // get content from quotes file
    $file_content=join('',file($quotes_file));

    // split string and make array with quotes
    $quotes_array=explode($separator_1,$file_content);

    // select random quote number
    $quotescount=sizeof($quotes_array);
    $random_number=rand(0,$quotescount-1);

    // calculate quote number
    $quote_number=$quotescount-$random_number;

    // make array with random quote and author
    $random_quote_array=explode($separator_2,$quotes_array[$random_number]);

    // show random quote and author
    echo "Quote $quote_number of $quotescount:\n<br>\n<br>\n";
    echo nl2br($random_quote_array[0]) . "\n<br>\n<br>\n" . $random_quote_array[1];

    ?>