[R] Recherche d'un mot dans un fichier txt

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

[R] Recherche d'un mot dans un fichier txt

#1

Message par davzell »

Bonjour à tous,

j'aurai besoin dans un script, de chercher si un document word contient une chaine de caractère, afin de le remplacer ensuite si c'est le cas.
Les serveurs d'ou seront lancé les scripts ne possédent pas tous word.

Je me suis dit que j'allais changer l'extension du document word en .txt afin de chercher ma chaine de caractère qui apparait bien si j'ouvre le fichier txt obtenu avec le bloc note.


Le soucis, est que mon script qui recherche le mot, ne marche que si j'ouvre et sauvegarde au moins une fois le document txt.

Dans le code, on peut voir que la variable "$line_number" reste à la valeur 1 tant que je n'ai pas ouvert/sauvegardé le document (elle pas à ce moment là à 74)

Est ce que quelqu'un sait pourquoi ?
Ou un moyen de contournement ?

j'ai joins le fichier en fin de post

merci

Code : Tout sélectionner

#include <FileConstants.au3>
#Include <File.au3>



$Convention = "C:\test\Lettre type.txt"
$soutput2 = "F" & " " & "U" & " " & "S" & " " & "I" & " " & "O" & " " & "N" & " " & "G"


$exist = FileExists($Convention)
If $exist = 0 Then
    MsgBox(16,"Erreur","Le fichier Lettre type.txt est introuvable à cet emplacement: " & $convention)
	Exit
EndIf
If $exist = 1 Then
    $line_number = _FileCountLines($Convention)

	MsgBox(16,"test",$line_number)

    $line_tested = 0
    $trouver = 0
    $Rep = ""
    While 1
        $line_tested = $line_tested +1
        $line_to_test = FileReadLine($Convention,$line_tested)
        FileWrite(@TempDir&"\temp_search",$line_to_test)
        $il_y_est=_ReplaceStringInFile(@TempDir&"\temp_search",$soutput2,"")
        If $il_y_est = 1 Then
            $Rep = $Rep&@CRLF&FileReadLine($Convention,$line_tested)
            $trouver = 1
        EndIf
        FileDelete(@TempDir&"\temp_search")
        If $line_tested = $line_number Then
            ExitLoop
        EndIf
    WEnd
    If $trouver = 0 Then
		MsgBox(16,"copie","non trouvé copie de ....")


	Else
		MsgBox(16,"copie","mot trouvé je copie ...")

    EndIf
endIf
Modifié en dernier par davzell le mar. 05 sept. 2017 09:07, modifié 2 fois.
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [...] Recherche d'un mot dans un fichier txt

#2

Message par parazitenew »

Bonjour, je ne sais pas si t'es au courant, mais changer un .doc en .txt ne constitue pas une conversion en soit. Et je prends comme preuve ton fichier texte joint qui est tout simplement illisible par le bloc note.
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [...] Recherche d'un mot dans un fichier txt

#3

Message par davzell »

il n'y a pas de mise en page et des signes particuliers partout, mais la valeur que je cherche est bien dedans et apparait clairement (il y a juste des espace en plus entre chaque lettre)

ce que je ne comprend pas pourquoi c'est pourquoi autoit arrive a le lire entièrement qu'une fois que j'ai enregistré le fichier et ne lis que la première ligne quand je ne le fais pas.

On m'a donné un moyen de contournement avec cette fonction https://www.autoitscript.com/forum/topi ... -doc-file/ qui extrait le texte d'un document word qu'on peut ensuite exploiter dans le code.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Recherche d'un mot dans un fichier txt

#4

Message par orax »

_FileCountLines retourne 1 parce que cette fonction ouvre le fichier Word (Lettre type.txt) comme un fichier binaire. Le contenu qui est lu commence par 0xD0CF11... Ce sont des données binaires, c'est la représentation en hexadécimal du fichier.
Un exemple :

Code : Tout sélectionner

#include <FileConstants.au3>
#include <File.au3>

$Convention = "C:\test\Lettre type.txt"
$soutput2 = "F" & " " & "U" & " " & "S" & " " & "I" & " " & "O" & " " & "N" & " " & "G"

$exist = FileExists($Convention)
If $exist = 0 Then
	MsgBox(16, "Erreur", "Le fichier Lettre type.txt est introuvable à cet emplacement: " & $Convention)
	Exit
EndIf
If $exist = 1 Then
	$line_number = _FileCountLines2($Convention)
	MsgBox(16, "$line_number _FileCountLines2", $line_number) ; affiche 0xD0CF11... (données binaires en hexadécimal)
	$line_number = _FileCountLines3($Convention)
	MsgBox(16, "$line_number _FileCountLines3", $line_number) ; affiche ÐÏࡱá...
EndIf

Func _FileCountLines2($sFilePath)
	Local $hFileOpen = FileOpen($sFilePath, $FO_READ)
	If $hFileOpen = -1 Then Return SetError(1, 0, 0)

	Local $sFileRead = StringStripWS(FileRead($hFileOpen), $STR_STRIPTRAILING)
	MsgBox(0, 'contenu _FileCountLines2', $sFileRead) ; affiche le contenu en hexadécimal
	FileClose($hFileOpen)
	Return UBound(StringRegExp($sFileRead, "\R", $STR_REGEXPARRAYGLOBALMATCH)) + 1 - Int($sFileRead = "")
EndFunc   ;==>_FileCountLines

Func _FileCountLines3($sFilePath)
	Local $hFileOpen = FileOpen($sFilePath, $FO_READ + $FO_ANSI) ; $FO_READ + $FO_ANSI
	If $hFileOpen = -1 Then Return SetError(1, 0, 0)

	Local $sFileRead = FileRead($hFileOpen)
	MsgBox(0, 'contenu _FileCountLines3', $sFileRead) ; affiche le contenu "brut"
	FileClose($hFileOpen)
	Return UBound(StringRegExp($sFileRead, "\R", $STR_REGEXPARRAYGLOBALMATCH)) + 1 - Int($sFileRead = "")
EndFunc   ;==>_FileCountLines2
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Répondre