Eine txt Datei auslesen und Referrer sortieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Eine txt Datei auslesen und Referrer sortieren

    Hallo,

    speichere Referrer in eine refdatei.txt und lese die mit dem ersten aus. Damit die Liste nicht zu lang wird, wollte ich diese Referrer jetzt mit array_count_values() auswerten, bekomme aber im ersten Beispiel nur eine Listung mit jeweils einer 1 als Ergebnis und im zweiten Beispiel wird nur eine Zeile ausgeben. Einzeln im Test funktioniert der Code problemlos. Weiß im Augenblick nicht weiter. Vor allem nicht, wie man die obere Liste von $q und $woher in den unteren Array übernehmen könnte oder welche Möglichkeiten da noch in Frage kommen würden.

    Gruß Mele

    Quellcode

    1. <?php
    2. //-------- Vatiante I ------------------------------------------------
    3. $muster = "/q%3D/is";
    4. $data = preg_grep($muster, file('refdatei.txt'));
    5. foreach($data as $referrer){
    6. $suchenr = array('q%3D','%26','%3F');
    7. $ersetze = array('q=','&','?ab&');
    8. $referrer = str_replace($suchenr,$ersetze,$referrer);
    9. parse_str($referrer); //Query-String wird sauber nach q und woher durchsucht.
    10. echo $q." - ".$woher."<br>"; //Ausgabe von $q und $woher ist fehlerfrei als Liste.
    11. }
    12. $fabel = array($q, $woher);
    13. $zaehle = array_count_values($fabel);
    14. arsort($zaehle);
    15. while (list($kw, $zahl) = each($zaehle)){
    16. echo $kw." - ".$zahl."<br>"; //Es wird nur eine Zeile mit $q und $woher ausgeben.
    17. }
    18. ?>
    19. <?php
    20. //-------- Vatiante II -----------------------------------------------
    21. $muster = "/q%3D/is";
    22. $data = preg_grep($muster, file('refdatei.txt'));
    23. foreach($data as $referrer){
    24. $suchenr = array('q%3D','%26','%3F');
    25. $ersetze = array('q=','&','?ab&');
    26. $referrer = str_replace($suchenr,$ersetze,$referrer);
    27. parse_str($referrer); //Query-String wird sauber nach q und woher durchsucht.
    28. echo $q." - ".$woher."<br>"; //Ausgabe von $q und $woher ist fehlerfrei als Liste.
    29. $fabel = array($q, $woher);
    30. $zaehle = array_count_values($fabel);
    31. arsort($zaehle);
    32. while (list($kw, $zahl) = each($zaehle)){
    33. echo $kw." - ".$zahl."<br>"; //Jede Zeile endet wieder miit 1 und keine Sortierung.
    34. }
    35. }
    36. ?>
    37. <?php
    38. //-------- Vatiante Test ----------------------------------------------
    39. $fabel = array('Test', 'Beispiel', 'Ballspeil', 'Test', 'Beispiel', 'Beispiel');
    40. $zaehle = array_count_values($fabel);
    41. arsort($zaehle);
    42. while (list($kw, $zahl) = each($zaehle)){
    43. echo $kw." - ".$zahl."<br>"; //Bei Einzeltest alles in Ordnung mit der Ausgabe.
    44. }
    45. /* Ausgabe
    46. Beispiel - 3
    47. Test - 2
    48. Ballspeil - 1
    49. */
    50. ?>
    Alles anzeigen
  • Du solltest mal error_reporting(E_ALL) am Anfang aufrufen.

    Am Beispiel von Skript 2:
    Notice: Undefined variable: q on line 17
    Notice: Undefined variable: woher on line 17
    Notice: Undefined variable: q on line 19
    Notice: Undefined variable: woher on line 19
    Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! on line 20
    Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! on line 20


    Desweiteren solltest du ein paar Informationen zum Debuggen ausgeben.
    zum Beispiel an dieser Stelle

    Quellcode

    1. $data = file('refdatei.txt');
    2. echo "vor dem filtern";
    3. print_r($data);
    4. $data = preg_grep($muster, $data);
    5. echo "nach dem filtern";
    6. print_r($data);
  • Nee, nee, nee, da kommen keine Fehlermeldungen, da $q und $woher durch parse_str sauber aus der .txt ausgelesen werden und sich dadurch definieren. Die Fehlermeldungen kommen nur, wenn die .txt nicht mit geladen wird. Habe noch einmal das zweite und dritte Beispiel mit error_reporting(E_ALL); in einem Testordner gepackt und hier mal die Links zu den beiden Dateien, wobei die referrer.php sich fehlerfrei laden lassen müsste, aber halt nur eine Zeile durch den unteren Array berücksichtigt wird.

    referrer.php
    refdatei.txt

    Quellcode

    1. <?php
    2. //-------- Vatiante II -----------------------------------------------
    3. error_reporting(E_ALL);
    4. $muster = "/q%3D/is";
    5. $data = preg_grep($muster, file('http://www.seo-welten.de/test/refdatei.txt'));
    6. foreach($data as $referrer){
    7. $suchenr = array('q%3D','%26','%3F');
    8. $ersetze = array('q=','&','?ab&');
    9. $referrer = str_replace($suchenr,$ersetze,$referrer);
    10. parse_str($referrer); //Query-String wird sauber nach q und woher durchsucht.
    11. echo $q." - ".$woher."<br>"; //Ausgabe von $q und $woher ist fehlerfrei als Liste.
    12. }
    13. $fabel = array($q, $woher);
    14. $zaehle = array_count_values($fabel);
    15. arsort($zaehle);
    16. while (list($kw, $zahl) = each($zaehle)){
    17. echo "<hr>".$kw." - ".$zahl."<hr>"; Es wird nur jeweils eine Zeile ausgegeben.
    18. }
    19. ?>
    20. <?php
    21. //-------- Vatiante Test ----------------------------------------------
    22. $fabel = array('Test', 'Beispiel', 'Ballspeil', 'Test', 'Beispiel', 'Beispiel');
    23. $zaehle = array_count_values($fabel);
    24. arsort($zaehle);
    25. while (list($kw, $zahl) = each($zaehle)){
    26. echo "<br>".$kw." - ".$zahl; //Bei Einzeltest alles in Ordnung mit der Ausgabe.
    27. }
    28. /* Ausgabe
    29. Beispiel - 3
    30. Test - 2
    31. Ballspeil - 1
    32. */
    33. ?>
    Alles anzeigen
  • Na gut, dann sag ich dir doch ein paar Fehler ;)

    Quellcode

    1. $zaehle = array_count_values($fabel);
    2. arsort($zaehle);
    3. while (list($kw, $zahl) = each($zaehle)){


    $zaehle ist eine Zahl. Wie soll man die sortieren, geschweige denn darüber iterieren?
    Außerdem kannst du das ja erst machen, nachdem du alle Daten mit foreach eingelesen hast.

    Schau dir mal mein altes Script an: nopaste.easy-coding.de/146
    Und ungefähr so kannst du es verbauen:

    Quellcode

    1. <?php
    2. $result = array();
    3. foreach(file('...') as $line) {
    4. $line = substr($line,6); // woher abschneiden
    5. $line = urldecode($line); // url dekodieren
    6. // nopaste script einbauen
    7. $result[$host][] = $keyword;
    8. }
    9. print_r($result);
    10. ?>
    Alles anzeigen


    Und nutz bitte die Syntax Buttons (unter dem Eingabefeld)
  • Hallo,

    der Hinweis mit print_r war gut und wichtig. Das eigentliche Problem war so leichter zu erkennen. Die obere Schleife schrieb nicht alles in einem Array, sondern jeden Referrer in einem eigenen Array, der jedes mal wieder mit array(1) { [0]=> string(Zahl) begann. So konnte in der unteren Schleife nur ein Referrer erfasst werden. Diese abgeänderte Schleife schreibt nun alle Referrer in einen Array, der mit Hilfe der unteren Schleife ausgezählt und sortiert wird. Erfasst werden wohl alle Sumas die ein q= oder ein p= enthalten, sowie als Kriterium fürs Muster "search". Eine Probe steht allerdings noch aus, da z.B. in MS noch nicht auffindbar. Anzumerken bleibt, dass q= nicht ausgelesen wurde, wenn im Referrer zwischen ? und q= nicht mindestens ein Buchstabe und ein & vorkommen. p= wurde erst nicht ausgelesen, nachdem nun p%3D zu q= gewandelt wird und das Fragezeichen einen Anhang erhält ?xx&, wird bisher alles sauber ausgelesen. Das jetzige Problem besteht besteht noch darin, das encode oder decode, gleich ob bei URL oder UTF-8, ohne Reaktion bleibt. Die Abspeicherung in die TXT ist unsauber, zumindest kommt es in den Referrern vor, dass ein Teil nicht kodiert ist, ein Teil UTF-8 kodiert und ein Teil wohl doppelt kodiert ist, wie dieses kleine ü hier %25C3%25BC zeigt. Nur da will ich mal sehen in wie weit sich da mit der Abspeicherung etwas verbessern lässt. Will auch noch einmal probieren, ob das bei anderen Hostern genauso aussieht oder ob da eine andere Abspeicherung erfolgt und die Angaben bei str_replace eventuell anders aussehen könnten. Doch das sind ja eher alles kleinere Problemchen, die so nach und nach verbessert werden können. So wie es jetzt ist, haut es zumindest erst einmal hin. Erst einmal meinen Dank an dieser Stelle.

    Gruß Mele

    Quellcode

    1. <?php
    2. $muster = "/search/i"; // Suchmuster
    3. $datei = fopen('refdatei.txt','r');
    4. while(!feof($datei)) {
    5. $zeile = fgets($datei, 10000); // Wieviel?
    6. if(preg_match($muster, $zeile)){
    7. $suchenr = array('q%3D','p%3D','%26','%3F','%3B','%25','%3D','+','%3A');
    8. $ersetze = array('q=','q=','&','?xx&','xx&',' ','=',' ',':');
    9. $refdata = str_replace($suchenr,$ersetze,$zeile);
    10. parse_str($refdata);
    11. $weiter = preg_replace("/[xx]/", " ", $woher);
    12. $alpha[] = $q;} // Bei Sumas $q durch $weiter ersetzen.
    13. }
    14. $zaehle = array_count_values($alpha);
    15. arsort($zaehle);
    16. while (list($KWs, $zahl) = each($zaehle))
    17. {
    18. echo $KWs. "--> <b>".$zahl."</b><br>\n";
    19. }
    20. ?>
    Alles anzeigen