Page 1 sur 1
[R] Pb lors de recup d'un num de ligne de fichier
Posté : jeu. 23 déc. 2010 15:53
par koa0
Bonjour à toute la communauté Autoit,
J'aimerais récupérer le numéro d'une ligne recherché dans un fichier. J'ai par conséquent fait cette petite fonction:
Code : Tout sélectionner
;recupere le numero d'une ligne choisit
func RecupererLigne($monfichier,$textARechercher)
local $lecture
local $iligne =0
while 1
$lecture = FileReadline ($monfichier)
$iligne += 1
if $lecture == $textARechercher then
$temp_ligne=$iligne
ExitLoop
EndIf
If @error = -1 Then ExitLoop
WEnd
FileClose ($open)
return $temp_ligne
EndFunc
et pour la tester je l'appelle de cette façon:
Code : Tout sélectionner
$itest=RecupererLigne("C:\AUTOMATISATION\betsi\test.txt","Ligne 7")
msgbox(0,"test",$itest)
Le script se bloque dans la boucle while. Quelque chose m'échappe. Pourriez vous m'indiquer l'erreur que je fais.
Merci
Re: [b]Pb lors de recuperation d'un num de ligne[/b]
Posté : jeu. 23 déc. 2010 15:54
par Jerome
Coucou,
Je vous conseil de lire
ceci.
Jérôme
Re: [...] Pb lors de recup d'un num de ligne de fichier
Posté : jeu. 23 déc. 2010 15:58
par koa0
en espérant que c'est mieux
Re: [...] Pb lors de recup d'un num de ligne de fichier
Posté : jeu. 23 déc. 2010 16:30
par zeshrek
Déjà, tu n'ouvrais pas ton fichier.
Ensuite, tu testais le contenu de la ligen avant meme de savoir si tu avais pas une erreur
Enfin, tu comparais la ligne entiere avec ce que tu cherchais, mais vu ton exemple ce que tu recherches n'est en fait qu'une partie de la ligne
Code : Tout sélectionner
;recupere le numero d'une ligne choisie
Func RecupererLigne($monfichier, $textARechercher)
$open = FileOpen($monfichier) ; il faut penser a ouvrir le fichier d'abord non ?
Local $lecture
Local $iligne = 0
Local $trouve = False
While 1
$lecture = FileReadLine($monfichier)
$iligne += 1
If @error = -1 Then ; on teste d'abord si on est a la fin du fichier
ExitLoop
EndIf
If StringInStr($lecture, $textARechercher) <> 0 Then ; comme je sais pas si ce que tu recherche c'est la ligne entiere ou juste un bout, on va faire comme si c'était une partie
$trouve = True
ExitLoop
EndIf
WEnd
FileClose($open)
If $trouve = True Then
Return $temp_ligne ; si la recherche aboutit, on renvoie le N° de ligne
Else
Return $trouve ; sinon, on renvoie False (-1)
EndIf
EndFunc
Re: [R] Pb lors de recup d'un num de ligne de fichier
Posté : jeu. 23 déc. 2010 16:39
par koa0
Merci beaucoup pour cette aide,
Effectivement j'oubliais quelques fondamentaux. Novice sur autoit, je pensais que Filereadline(...) ouvrait le fichier.
Petite correction sur le script si on ouvre le fichier avec le pipe open on doit le réutiliser dans FileReadLine
Code : Tout sélectionner
;recupere le numero d'une ligne choisie
Func RecupererLigne($monfichier, $textARechercher)
$open = FileOpen($monfichier) ; il faut penser a ouvrir le fichier d'abord non ?
Local $lecture
Local $iligne = 0
Local $trouve = False
While 1
$lecture = FileReadLine($open)
$iligne += 1
If @error = -1 Then ; on teste d'abord si on est a la fin du fichier
ExitLoop
endif
If StringInStr($lecture, $textARechercher) <> 0 Then ; comme je sais pas si ce que tu recherche c'est la ligne entiere ou juste un bout, on va faire comme si c'était jsute une partie
$trouve = True
$temp_ligne=$iligne
ExitLoop
EndIf
WEnd
FileClose($open)
If $trouve = True Then
Return $temp_ligne ; si la recherche est infructueuse, on renvoie le N° de ligne
Else
Return $trouve ; sinon, on renvoie False (-1)
EndIf
EndFunc
Bonne fin de journée
Re: [...] Pb lors de recup d'un num de ligne de fichier
Posté : jeu. 23 déc. 2010 16:40
par Jerome
N'oubliez pas la balise [R] dans le titre de votre premier message si votre sujet est résolu.
Re: [...] Pb lors de recup d'un num de ligne de fichier
Posté : jeu. 23 déc. 2010 18:29
par bloodwolff
Filereadline() ouvre effectivement le fichier et ce n'était pas vraiment un erreur , mais il l'ouvre et le referme à chaque lecture de ligne ce qui fait perdre beaucoup de temps , c'est doc quand même mieux de l'ouvrir avant

Re: [...] Pb lors de recup d'un num de ligne de fichier
Posté : jeu. 23 déc. 2010 20:31
par sylvanie
Voici un autre exemple en fonction récursive (pour lister tous les numéros de ligne si il y en a plusieures) exploitant les expressions régulières, où on délimite les blocs se finissant par l'expression cherhée et on compte le nombre de retours chariots :
► Afficher le texte
Code : Tout sélectionner
$contenu=FileRead(@ScriptDir&"\autoit\dico2.txt")
$recherche="MAISON"
MsgBox(0,"retrouve ligne","numéro(s) de ligne ="&retrouveligne($contenu,$recherche))
Func retrouveligne($str,$search,$rec=0)
Local $substract,$ret,$tab
$ret=""
$substract=StringRegExpReplace($str,"(?s)(.*)("&$search&")(.*)","$1",1)
If @error<>0 Or @extended=0 Then Return $ret
$tab=StringSplit($substract,@LF)
$ret=$tab[0]
$ret= retrouveligne($substract,$search,$rec+1)&";"&$ret
If Not $rec Then
$ret=StringTrimLeft($ret,1)
EndIf
Return $ret
EndFunc
Limitation : si l'expression est présente n fois sur la même ligne alors on aura n fois le numéro de ligne
Bon, j'admet que là c'est un peut sortir la pelleteuse pour planter un piquet ...
Re: [...] Pb lors de recup d'un num de ligne de fichier
Posté : sam. 25 déc. 2010 21:27
par GELDROC
il existe aussi la fonction suivante :
Code : Tout sélectionner
$Ma_Rcherche = "Ces Ceci que je Cherche XD"
$Ma_Ligne_Rechercher_Sera = ""
dim $aRead
_FileReadToArray("Fichier.xxx", $aRead)
if @erreur then Exit
for $l = 1 to $aRead[0]
if $aRead[$l] = $Ma_Rcherche then
$Ma_Ligne_Rechercher_Sera = $l
$l = $aRead[0]
endif
next
msgbox(0, "Resulta", '"' & $Ma_Rcherche & '" Ce trouve Ligne : ' & $Ma_Ligne_Rechercher_Sera)
avec tous çà je pense que ton problème doit être résolu ?
ci oui remplace [..] par [R]