You are not logged in.

  • Login

1

Friday, June 20th 2008, 12:16am

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

PHP Quellcode

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

2

Friday, June 20th 2008, 8:24am

Du solltest mal error_reporting(E_ALL) am Anfang aufrufen.

Am Beispiel von Skript 2:

Quoted

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

PHP Quellcode

1
2
3
4
5
6
$data = file('refdatei.txt');
echo "vor dem filtern";
print_r($data);
$data = preg_grep($muster, $data); 
echo "nach dem filtern";
print_r($data);

3

Friday, June 20th 2008, 11:21am

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

PHP Quellcode

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

4

Friday, June 20th 2008, 12:00pm

Na gut, dann sag ich dir doch ein paar Fehler ;)

PHP Quellcode

1
2
3
$zaehle = array_count_values($fabel);
arsort($zaehle);
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: http://nopaste.easy-coding.de/146
Und ungefähr so kannst du es verbauen:

PHP Quellcode

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


Und nutz bitte die Syntax Buttons (unter dem Eingabefeld)

5

Sunday, June 22nd 2008, 4:32pm

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

PHP Quellcode

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

Similar threads

Social bookmarks