Page 1 sur 1

[..] Action suite à la lecture d'un fichier log

Posté : dim. 24 août 2008 22:20
par mafooley
Bonjour à tous,

j'aimerai pouvoir copier des lignes d'un fichier log d'un logiciel de chat qui se complète en temps réel, en fonction de la personne qui écrit le message.
Les lignes s'affichent les unes à la suite des autres à la fin du fichier.

Imaginez 3 personnes discutant: pseudo1, pseudo2 et pseudo3

Je désire, par exemple, copier uniquement les lignes écrites par pseudo2.

Le script devrait alors analyser à chaque fois la dernière ligne du fichier et rechercher la chaîne de caractères "pseudo2 à écrit:"
Si cette chaîne est bien présente dans la ligne, la ligne doit être copier et coller dans un autre fichier texte.
L'ouverture et l'écriture du nouveau fichier texte ne pose pas de problème en soit, mais le reste...

Merci d'avance,

Maf

Re: [.] Action suite à la lecture d'un fichier log

Posté : dim. 24 août 2008 22:27
par jbnh
Il faut savoir comment se présente la ligne pour chaque message.

(exemple : pseudo2 : blablabla)

Re: [..] Action suite à la lecture d'un fichier log

Posté : dim. 24 août 2008 23:12
par mafooley
c'est de ce type:

<pseudo2> blablablablabla...
<pseudo1> blabla...
<pseudo2> bla...

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 01:28
par jbnh

Code : Tout sélectionner

#include <string.au3>

;------------------------------------------------
$filename = 'test2.txt'
$filename2 = 'recup.txt'
$pseudo = '<pseudo1>'
;------------------------------------------------

$file = FileOpen($filename, 0)
$read = FileRead($file)
$line = StringSplit($read, @CR)

For $i = 1 To $line[0]

$var = FileReadLine($file, $i)
$newline = _StringBetween($var, $pseudo, @LF)
If IsArray ($newline) Then            
$text = $newline[0]
FileWrite($filename2, $text & @CRLF)
Endif

Next
FileClose($filename)
FileClose($filename2)
Ca marche pas et pourtant tout à l'air correct, pourquoi? :lol:

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 01:37
par jbnh

Code : Tout sélectionner

#include <file.au3>
 
Dim $array
;-------------------------------------------
Dim $pseudo = "<pseudo1> "
$filename = 'test2.txt'
$filename2 = 'recup.txt'
;-------------------------------------------

_FileReadToArray($filename, $array)
For $X = 1 to $Array[0]
    If StringInStr($array[$X], $pseudo) Then
       $var = FileReadLine($filename, $X)
       $text = StringReplace($var, $pseudo, "")
       FileWrite($filename2, $text & @CRLF)    
    EndIf
Next
Voila une méthode qui marche.

Compléter les informations:
- test2.txt : fichier source

Code : Tout sélectionner

<pseudo2> blablablablabla...
<pseudo1> blabla... 
<pseudo2> bla...
<pseudo1> kiki  
- <pseudo1>: le pseudo de la personne dont on veut récupérer tout les phrases.
- recup.txt: le fichier avec les phrases de pseudo1

Ca ne marche que pour la configuration : <pseudo> texte


Oubliez pas de trouver l'erreur de mon premier script. Merci :)

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 12:20
par Tlem
jbnh a écrit :Oubliez pas de trouver l'erreur de mon premier script. Merci :)
Heuu il y en à plusieurs ... :lol:

Code : Tout sélectionner

$line = StringSplit($read, @CR)
Tu met l'ensemble du fichier en tableau pour connaitre uniquement le nombre de ligne !!! Pas trés logique. Il aurait mieux valut que tu travail direct sur le tableau à la recherche de $pseudo.
Ensuite, tu lit le fichier ligne par ligne à la recherche de $pseudo en utilisant _StringBetweenen. :shock: Pas trés fonctionnel !
D'autant plus que tu recherche une chaine entre $pseudo et un @LF (qui n'existe pas).
Dans ce cas, il aurait fallut faire ceci :

Code : Tout sélectionner

    $var = FileReadLine($file, $i) & @LF
    $newline = _StringBetween($var, $pseudo, @LF)
 
Voilà pour ton premier code.

En ce qui concerne le deuxième code, il est nettement plus simple, mais toujours pareil, tu utilise _FileReadToArray pour connaitre le nombre de ligne (pas logique car la macro @error est là pour ça !!!) et ensuite tu fait alternativement une lecture de fichier puis une écriture dans un autre fichier or ceci demande beaucoup de temps sur des fichiers de grandes importance. Il vaudrait mieux faire la lecture ligne par ligne comme tu le fait mais en utilisant le Handle du fichier et de mettre le résultat dans une chaine pour à la fin du traitement écrire le résultat dans le fichier.

Voici 3 manières d'utiliser ce code :
Solution N°1 :

Code : Tout sélectionner

#include <file.au3>
 
Dim $array
;-------------------------------------------
Dim $pseudo = "<pseudo1> ", $text
$filename = 'test2.txt'
$filename2 = 'recup.txt'
;-------------------------------------------

_FileReadToArray($filename, $array)
For $X = 1 to $Array[0]
    If StringInStr($array[$X], $pseudo) Then
       $text &= StringReplace($array[$X], $pseudo, "") & @CRLF
    EndIf
Next

FileWrite($filename2, $text)
Solution N°2 :

Code : Tout sélectionner

#include <file.au3>
 
;-------------------------------------------
Dim $pseudo = "<pseudo1> ", $i, $text
$filename = 'test2.txt'
$filename2 = 'recup.txt'
;-------------------------------------------

While 1
    $i += 1
    $var = FileReadLine($filename, $i)
    if @error = -1 Then ExitLoop
    
    If StringInStr($var, $pseudo) Then
       $text &= StringReplace($var, $pseudo, "") & @CRLF
    EndIf
WEnd

FileWrite($filename2, $text)
Et enfin,
Solution N°3 (La plus propre) :

Code : Tout sélectionner

#include <file.au3>
 
;-------------------------------------------
Dim $pseudo = "<pseudo1> ", $text
$filename = 'test2.txt'
$filename2 = 'recup.txt'
;-------------------------------------------

$file = FileOpen($filename, 0)

While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop

    If StringInStr($line, $pseudo) Then
       $text &= StringReplace($line, $pseudo, "") & @CRLF
    EndIf
Wend

FileWrite($filename2, $text)    
FileClose($filename)
Je fait évidemment abstraction des tests d'ouverture de fichier ...

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 12:31
par jbnh
J'espère qu'un jour, moi petit padawan, aurai ta puissance du grand jedi :lol:

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 12:50
par Tlem
jbnh a écrit :J'espère qu'un jour, moi petit padawan, aurai ta puissance du grand jedi :lol:
Rhooo, pourtant je n'ai pas beaucoup de connaissance par rapport à d'autres. ;)
Je serais plutôt padawan de deuxième année tout au plus (et encore). :mrgreen:

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 17:18
par mafooley
Merci beaucoup, je vais essayer ça.

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 20:54
par timmalos
Tlem a écrit :
jbnh a écrit :J'espère qu'un jour, moi petit padawan, aurai ta puissance du grand jedi :lol:
Rhooo, pourtant je n'ai pas beaucoup de connaissance par rapport à d'autres. ;)
Je serais plutôt padawan de deuxième année tout au plus (et encore). :mrgreen:
Alors la je suis pas d'accord... Si toi, t'es padawan de deuxième année, on est quoi nous?
Je te verrai plutôt dans le rôle de Yoda :)

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 21:01
par jbnh
Dans le rôle de yoda, il est :lol:

Re: [..] Action suite à la lecture d'un fichier log

Posté : lun. 25 août 2008 23:06
par Tlem
timmalos a écrit :Alors la je suis pas d'accord... Si toi, t'es padawan de deuxième année, on est quoi nous?
Je te verrai plutôt dans le rôle de Yoda :)
Hummm je pense que vous vous mèprenez les amis, car mes connaissances sont très limitées (C'est surement par-ce que je passe du temps à chercher et à fouiller que je trouve les réponses mais surement pas grace à mes connaissances)
Sylvanie, Voodoo, Michel Claveau, moutelous et d'autres font surement partie de ceux qui ont le plus de connaissances sur ce forum mais je suis très largement loin derrière eux.
Enfin l'essentiel c'est de partager. ;)