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:
;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
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
;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
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
;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
Modifié en dernier par koa0 le jeu. 23 déc. 2010 16:41, modifié 1 fois.
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
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 :
$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 ...
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
$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]