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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#1

Message 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
 
Modifié en dernier par corrs78 le mar. 06 oct. 2009 16:52, modifié 1 fois.
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

Re: Comment chercher une chaine de caractère dans

#2

Message par jbnh »

Bonjour, a chaque ligne utilisez StringInStr (voir doc) qui veut dire string in string donc ici mot dans votre phrase.
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#3

Message par corrs78 »

Je pense avoir compris le principe de cette fonction, mais je m'en sort pas :/
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#4

Message par orax »

Modifiez la fonction search_user_pc() comme ça :
► Afficher le texte
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#5

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#6

Message 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.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

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

#7

Message 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
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#8

Message 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
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#9

Message par orax »

Erf, je n'ai pas tout compris dans votre code. Mais voilà ce que j'ai fait :
► Afficher le texte
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

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

#10

Message 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
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#11

Message par corrs78 »

C'est curieux, ça décrémente bien maintenant , mais j'ai aucun résultat. :(.

En incrémentant ça fonctionne .
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#12

Message 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. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#13

Message 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.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#14

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#15

Message 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.
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

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

#16

Message 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.
Répondre