Page 1 sur 1

[R] Comment chercher une chaine de caractère dans un fichier

Posté : mar. 06 oct. 2009 11:59
par corrs78
J'ai besoin de vos lumières, mais connaissances en Autoit on atteint leurs limites (limite basse :) )

je dois trouver une chaine de caractère dans un fichier. j'ai trouvé la moyen de parcourir les lignes, mais cela fonctionne seulement si je cherche la ligne complète. Hors j'aimerais trouver seulement le numéro d'inventaire du pc dans cette ligne.

Comment faire ?

Merci à vous.

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;##################### FONCTION RECHERCHE DANS FICHIER ###########################

$windows = GUICreate ("Cherche numero inventaire UC" , 150 , 80 , ( @DesktopWidth-300 ) / 2 , ( @DesktopHeight-200 ) / 2, $WS_VISIBLE)

;Fonction de recherche numéro inventaire ordi
    $box_num_inv = GUICtrlCreateInput("", 20, 20, 60, 17)
    $bt_search = GUICtrlCreateButton(" -> ", 80, 20, 18, 18)


While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
        
    Case $msg = $bt_search 
        search_user_pc()
        
    EndSelect
    WEnd
        
Func search_user_pc()
    $search_num_inv = GUICtrlRead($box_num_inv)
    
for $i = 1 to 100
$pc_liste = FileOpen("c:\test.log", 0)
    $line = FileReadLine($pc_liste, $i) ; on parcours chaque ligne du fichier TXT
   If $line = $search_num_inv then 
        MsgBox(48,"trouvé : ",$line)
        EndIf
    Next
        FileClose($pc_liste)
EndFunc
 

Re: Comment chercher une chaine de caractère dans

Posté : mar. 06 oct. 2009 14:52
par jbnh
Bonjour, a chaque ligne utilisez StringInStr (voir doc) qui veut dire string in string donc ici mot dans votre phrase.

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mar. 06 oct. 2009 18:09
par corrs78
Je pense avoir compris le principe de cette fonction, mais je m'en sort pas :/

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mar. 06 oct. 2009 18:22
par orax
Modifiez la fonction search_user_pc() comme ça :
► Afficher le texte

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mer. 07 oct. 2009 15:17
par corrs78
Super merci ça fonctionne.

Par contre, curieusement, (surement logiquement) si je rajoute un "Else" pour afficher un message diffèrent en cas de réponse negative, cela ne fonctionne plus.

Est-il possible de parcourir les lignes du fichier en partant de la dernière ligne ?

merci

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mer. 07 oct. 2009 16:26
par Tlem
En utilisant la fonction _FileReadToArray(), vous aurez un tableau qu'il vous sera possible de lire dans un sens comme dans l'autre.

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mer. 07 oct. 2009 21:06
par sylvanie
une autre option est d'utiliser _FileCountLines pour avoir le nomnre de ligne puis utiliser le dernier paramètre optionel de FileReadLine ( filehandle or "filename" [, line] ), donc line, dans une boucle partant de la fin au début

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : jeu. 08 oct. 2009 17:22
par corrs78
sylvanie a écrit :une autre option est d'utiliser _FileCountLines pour avoir le nomnre de ligne puis utiliser le dernier paramètre optionel de FileReadLine ( filehandle or "filename" [, line] ), donc line, dans une boucle partant de la fin au début
Cette solution me parait simple à mettre en œuvre, pourtant je n'y arrive pas.
j'ai mis ces paramètres dans ma boucle :
$i = _FileCountLines("c:\logon.log")

While $i <= $i - 20 ;pour limiter à 20 résultats.
$line = FileReadLine($pc_liste, $i) ; on parcours chaque ligne du fichier TXT en commençant par la fin.
If @error = -1 or $var = 2 Then ExitLoop
$resultat=StringInStr($line, -1)
If StringInStr($line, $search_srti) Then
$var = MsgBox(1, "Historique d'ouverture de session ", $result2)
$i = $i-1
EndIf
WEnd

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : jeu. 08 oct. 2009 18:25
par orax
Erf, je n'ai pas tout compris dans votre code. Mais voilà ce que j'ai fait :
► Afficher le texte

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : jeu. 08 oct. 2009 19:17
par sylvanie
oui, c'est plus à une bouce dans l'optique d'Orax que je pensais.

on peut aussi faire avec un while, mais celui ci : While $i <= $i - 20
retourne toujours faux : $i <= $i - 20 équivaut à 0 <= -20 ...
il faut passer par une copie intermédiaire qui reste fixe
par exple :
$ind_max = $i

puis while $i >= $ind_max -20
...
$i-=1
wend

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : ven. 09 oct. 2009 12:27
par corrs78
C'est curieux, ça décrémente bien maintenant , mais j'ai aucun résultat. :(.

En incrémentant ça fonctionne .

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : ven. 09 oct. 2009 15:56
par Tlem
Perso, je ne vois pas l'intérêt de passer par une boucle While puisque le nombre de ligne est connu !!!

Voici ce qui me semble plus logique (le code est tellement simple que je ne détail pas ;) ) :

Code : Tout sélectionner

#Include <File.au3>

$File = "c:\logon.log"
$search_string = "chaine à trouver"

For $i = _FileCountLines($File) to 1 Step -1
    $line = FileReadLine($File, $i)
    If StringInStr($line, $search_string) Then
        MsgBox(64, "Chaine trouvée", "La chaine à été trouvée dans la ligne N°" & $i & " :" & @CRLF & $line)
    EndIf
Next
Et si jamais on ne veut pas continuer la recherche de la chaîne après l'avoir trouvé un première fois, il suffit de rajouter un ExitLoop juste après l'affichage de la MsgBox. ;)

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mar. 13 oct. 2009 16:55
par corrs78

Code : Tout sélectionner

#Include <File.au3>

$search_string = "43973"
$File = FileOpen("c:\logon.log", 0)
    If $File = -1 Then
        MsgBox(0, "Erreur", "Impossible d'ouvrir le fichier !")
        Exit
    EndIf

For $i = _FileCountLines($File) to 1 Step -1
    $line = FileReadLine($File, $i)
    If StringInStr($line, $search_string) Then
        MsgBox(64, "Chaine trouvée", "La chaine à été trouvée dans la ligne N°" & $i & " :" & @CRLF & $line)
    EndIf
Next

FileClose($File)
Merci pour ton aide Tlem, mais je dois être bête car cela ne fonctionne pas. Si jecherche le num inventaire "43973" qui se trouve plusieurs fois dans mon fichier logon, je n'ai aucune réponse en retour.

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mar. 13 oct. 2009 19:56
par orax
C'est normal :mrgreen: Mettez à la place :

Code : Tout sélectionner

For $i = _FileCountLines([b]"c:\logon.log"[/b]) to 1 Step -1

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mer. 14 oct. 2009 13:07
par corrs78
Super ça fonctionne avec une boucle for.
Par contre, si je fais une recherche sur un fichier log de 3000 lignes , ça rame à fond. Le processeur souffre et ça prend presque 5 minutes pour obtenir mon résultat.

Avec la boucle while c'était instantané.

Je pense que la soluce serait de chercher dans un tableau, mais là je ne maitrise pas du tout.

je touche au but :) Merci à vous pour votre aide si précieuse.

Re: [..]Comment chercher une chaine de caractère dans un fichier

Posté : mer. 14 oct. 2009 14:01
par corrs78
corrs78 a écrit :Super ça fonctionne avec une boucle for.
Par contre, si je fais une recherche sur un fichier log de 3000 lignes , ça rame à fond. Le processeur souffre et ça prend presque 5 minutes pour obtenir mon résultat.

Avec la boucle while c'était instantané.

Je pense que la soluce serait de chercher dans un tableau, mais là je ne maitrise pas du tout.

je touche au but :) Merci à vous pour votre aide si précieuse.
Pour une fois, j'ai trouvé par moi même.
En fait le problème était là :

Code : Tout sélectionner

$line = FileReadLine($pc_liste[color=#FF0000][b],$i[/b][/color])
C'est marqué dans la doc :
From a performance standpoint it is a bad idea to read line by line specifying "line" parameter whose value is incrementing by one. This forces AutoIt to reread the file from the beginning until it reach the specified line.