[php] array vullen met tekstbestand

Pagina: 1
Acties:
  • 264 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ilovetechno
  • Registratie: Oktober 2001
  • Laatst online: 17:06
Ik heb een bepaald log bestand genaamd chat.LOG. Hieruit wil ik bepaalde data halen

Ik heb de volgende reeds gemaakt maar dit doet niet wat ik wil.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$filename = 'CHAT.log'; 
$lines = file($filename); 
$van ='domSendChatEx';
$tot = "....";

foreach($lines AS $line) 
{ 
    list($waarde, $van, $tot) = sscanf($line, "domSendChatEx%s"); 
    echo $line;
} 

?> 



Het doel is om regel voor regel uit te lezen en de de tekst in tussen "domSendChatEx" en "...." in een array te zetten. Deze komt dus meerdere malen voor in chat.LOG

Wat doe ik fout?

Acties:
  • 0 Henk 'm!

Verwijderd

als ik de documentatie lees van sscanf op php.net, lijkt het dat in de tweede parameter, het aantal %s, %d. etc. gelijk moet zijn aan het aantal parameters in list()...., maar als elke regel begint met "$van" en eindigt met "$tot", is er toch wel een eenvoudigere methode om dit op te splitsen?? bijvoorbeeld split met een goede regex.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Begin maar eens de manual te lezen mbt list. Daarnaast slaat ej code binnen de foreach helemaal nergens op wanneer je een array wilt maken van de voorkomens in alle regels.

Probeer gewoon eens een aanpak uit te denken over hoe dit zou moeten ipv doelloos wat commando's aan elkaar rijgen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • evolnick
  • Registratie: Januari 2006
  • Laatst online: 04-06-2024
janoz heeft gelijk, maar om je iets meer te helpen :) kun je bijvoorbeeld gebruik maken van strpos,strrpos en substr. De uitkomst daarvan kun je weer in een array gooien.

Acties:
  • 0 Henk 'm!

  • D4V3
  • Registratie: Augustus 2003
  • Laatst online: 19-03-2021
Je kan het ook met Regular Expressions doen,
Dan hoef je hem ook niet regel per regel in te laden.

Voorbeeldje:
PHP:
1
2
3
4
5
6
7
8
9
<?php
$filename = 'CHAT.log'; 
$content = file_get_contents($filename); 

preg_match_all("/domSendChatEx(.*)\.{4}/Ui", $content, $values);

array_shift($values);
$values = $values[0];
?>


Overigens niet getest dus kan nog een foutje in staan.
Hiermee laad je de compete file in een variabele,
dan gooi je met de preg_match_all je content in een array ($values), en vervolgens gooi je met array_shift je eerste array waarde weg (welke de complete match showt, dat wil je niet). Ben waarschijnlijk nog wat vergeten maar hier zal je wel mee vooruit kunnen.

edit - Was dus idd wat vergeten, de U modifier achter de / in de regexp om hem niet "GREEDY" te maken en een $values = $values[0]; om de multidementionale array in een normale array te zetten.

sscanf is niet echt relevant hier aangezien deze te nauwkeurig is (je inhoud moet precies matchen op de spatie toe aan de voorwaarde van sscanf, dat doet het niet dus werkt het niet! sscanf is makkelijk om een ip adress in de vorm van een string om te zetten naar een array).

[ Voor 27% gewijzigd door D4V3 op 17-10-2006 18:30 ]

op-voorraad.nl - Realtime voorraad updates voor de Playstation 5!


Acties:
  • 0 Henk 'm!

  • Paul C
  • Registratie: Juni 2002
  • Laatst online: 14:02
Als je het regel voor regel door wilt werken, dan kun je natuurlijk beter gewoon fgets(); gebruiken.

PHP:
1
2
3
4
5
6
if($handle = fopen(file.txt)) {
    while(!feof($handle)) {
        $regel = fgets($handle); // hier dus je code om de regel te interpreteren
    }
}
else echo 'error opening file';

Acties:
  • 0 Henk 'm!

  • D4V3
  • Registratie: Augustus 2003
  • Laatst online: 19-03-2021
hehe, de file functie die de TS in zijn eerste post gebruikt is een verkorte versie van fgets,
Wat jij daar in 6 regels doet doet hij in 1 regel, namelijk
PHP:
1
$filearray = file("file.txt");


hier komt uit: Array ( "regel1", "regel2", "regel3", "enz").

file heeft geen file handler nodig (dus fopen wordt overbodig) en plaatst automatisch alle regels in een array zonder een loop te gebruiken. (de while loop met feof wordt hierdoor ook overbodig). Uiteraard heb je nog wel een loop nodig om het geheel per regel door te lopen...

Ik zie uberhaupt het punt er niet van in om het per regel in te lezen...

[ Voor 28% gewijzigd door D4V3 op 17-10-2006 23:23 ]

op-voorraad.nl - Realtime voorraad updates voor de Playstation 5!


Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 11:30

Guldan

Thee-Nerd

doet $file = file_get_contents("C:\test.txt"); niet precies wat jij wilt? en dit was ook vrij makkelijk te vinden onder file in de php manual.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • Paul C
  • Registratie: Juni 2002
  • Laatst online: 14:02
Mag ik, uit de OP:
Het doel is om regel voor regel uit te lezen en de de tekst in tussen "domSendChatEx" en "...." in een array te zetten. Deze komt dus meerdere malen voor in chat.LOG
owkay, regex, maar dat is voor sommigen hoog gegrepen en als er een behoorlijke consistentie in de log zit (wat meestal wel is met logs), dan is een niet regex oplossing vaak veel sneller.

Acties:
  • 0 Henk 'm!

  • ilovetechno
  • Registratie: Oktober 2001
  • Laatst online: 17:06
Hartelijk dank allemaal. Mede dankzij jullie tips heb ik de volgende code gemaakt welke naar wens is.. het kan wellicht mooier maar dit werkt iig. Ik ga nu verder alles in MySQL te zetten en laat wat grafieken genereren.

PHP:
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
<?php 

echo '<table border="1">';
echo '<tr>';
echo '<tr><td>tijd</td><td>van</td><td>aan</td></tr>';
echo '<tr>';

if($handle = fopen("chat.LOG", "r")) { 
    while(!feof($handle)) { 
        $regel = fgets($handle); 
        if(ereg("domSendChatEx",$regel)) {  
        $regel2=$regel;    
    
        $tijdtemp=7;
        $tijd = substr($regel,10,$tijdtemp);
        
        $nrvantemp=4;
        $nrvan = substr($regel2,44,$nrvantemp);
        
        $nraantemp=3;
        $nraan = substr($regel2,58,$nraantemp);
        
        echo '<td VALIGN="top">';               
        echo $tijd;
        echo '</td><td VALIGN="top">';          
        echo $nrvan;
        echo '</td><td VALIGN="top">';      
        echo $nraan;
        echo '</td></tr>';  
 
        
        }
}       

    
    } 
 
else echo 'error opening file'; 
echo '</table>';
?>

Acties:
  • 0 Henk 'm!

  • Atari Paul
  • Registratie: November 2002
  • Laatst online: 22:54
PS even voor degenen die hier roepen dat ze niet veel zien in het regel voor regel inlezen en parsen.
Bij grote bestanden lijkt het mij beter om het regel voor regel te doen ivm geheugenconsumptie (ok, als het kleine bestanden zijn dan kun je het beter in een keer inlezen).

Stability ?? My Atari still has it :)


Acties:
  • 0 Henk 'm!

  • ilovetechno
  • Registratie: Oktober 2001
  • Laatst online: 17:06
Atari Paul schreef op woensdag 18 oktober 2006 @ 11:29:
PS even voor degenen die hier roepen dat ze niet veel zien in het regel voor regel inlezen en parsen.
Bij grote bestanden lijkt het mij beter om het regel voor regel te doen ivm geheugenconsumptie (ok, als het kleine bestanden zijn dan kun je het beter in een keer inlezen).
Dit zijn textbestanden van 5MB per stuk.

Acties:
  • 0 Henk 'm!

  • Paul C
  • Registratie: Juni 2002
  • Laatst online: 14:02
ilovetechno schreef op woensdag 18 oktober 2006 @ 14:18:
[...]


Dit zijn textbestanden van 5MB per stuk.
Ik geloof dat het geheugengebruik standaart op 8MB is gecapped, maar dat kun je wss wel met phpinfo() vinden.

Ik zie nu trouwens ook dat ik in mijn voorbeeld en jij in je code bent vergeten om fclose($handle); te doen als je klaar bent met het file. Dat is wel zo netjes :)

Acties:
  • 0 Henk 'm!

  • ilovetechno
  • Registratie: Oktober 2001
  • Laatst online: 17:06
pcmadman schreef op donderdag 19 oktober 2006 @ 00:08:
[...]

Ik geloof dat het geheugengebruik standaart op 8MB is gecapped, maar dat kun je wss wel met phpinfo() vinden.

Ik zie nu trouwens ook dat ik in mijn voorbeeld en jij in je code bent vergeten om fclose($handle); te doen als je klaar bent met het file. Dat is wel zo netjes :)
Zal ik doen. Inmiddels ben ik al verder gevorderd en worden alle waarden ieder uur netjes in een MySQL Databese gezet. :)
Pagina: 1