Page 1 sur 1

[R] Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mar. 05 déc. 2017 14:54
par jeanbamin
Bonjour,
j'ai essayé de me débrouiller seul mais je coinçe, je suis grand débutant sur autoit :D
Voici mon besoin :
Je dois remplacer les caractères "41100000 XINT" par "41110000 XINT" dans plusieurs fichiers contenus dans plusieurs répertoires et celà quotidiennement d'ou la recherche d'un script pour le faire.

Je me suis basé sur ce post qui se rapproche de mon besoin : https://www.autoitscript.fr/forum/viewtopic.php?t=8431

Malheureusement ce script ne se contente pas de remplacer les caractères recherché par d'autres mais il ajoute des lignes.
Y a t il moyen de simplement faire la recherche et le remplacement ?

voici le code que j'utilise pour le moment et qui atteint presque son but :lol:

Merci d'avance

Code : Tout sélectionner

#Include <File.au3>

Global $repertoire =@ScriptDir&"\TEST"
importsage($repertoire)

Func importsage($PathFolder,$sFilter="*.PNM")
Local $array=_FileListToArray(@ScriptDir&"\TEST",$sFilter,1)
If $array=0 Then
MsgBox(64,"erreur","erreur path dossier")
Else
If $array[0] > 0 Then
Local $file,$strTmp
For $i=1 To $array[0]
$file=FileOpen($repertoire&"\"&$array[$i],0)
If $file=-1 Then
MsgBox(64,"erreur","erreur ouverture fichier 1")
Else
$strTmp=FileRead($file)
FileClose($file)
$file=FileOpen($repertoire&"\"&$array[$i],2)
If $file=-1 Then
MsgBox(64,"erreur","erreur ouverture fichier 2")
Else
$CRLF = StringReplace(_ReplaceAndAddString($strTmp), @CR, @CRLF)
FileWrite($file,StringReplace($CRLF, @LF, @CRLF))
FileClose($file)
EndIf
EndIf
Next
EndIf
EndIf
EndFunc

Func _ReplaceAndAddString($string="",$replaceString="41100000     XINT",$addString="")
If $string <> "" And StringInStr($string,"41100000     XINT") <>0 Then
Local $str=StringSplit($string,@LF,0)
$tmp=""
For $i=1 To $str[0]
If StringInStr($str[$i],"41100000     XINT") <> 0 Then
$tmp&=_StringBetween2String($str[$i],"",":")&$addString&@CRLF
$tmp&=StringReplace($str[$i],$replaceString,"41110000     XINT")
Else
$tmp&=$str[$i]
EndIf
Next
Return $tmp
Else
Return $string
EndIf
EndFunc

Func _StringBetween2String($String, $StringDebut, $StringFin, $caseSense = False)
If ((IsString($String) And IsString($StringDebut) And IsString($StringFin)) And IsBool($caseSense)) Then
Local $case = 0
If $caseSense Then
$case = 1
EndIf
If $StringDebut = "" Then
Return StringMid($String, 1, (StringInStr($String, $StringFin, $case, 1)) - 1)
ElseIf $StringFin = "" Then
Return StringMid($String, (StringInStr($String, $StringDebut, $case)) + StringLen($StringDebut))
Else
Local $debut = StringInStr($String, $StringDebut, $case)
If @error = 0 Then
Local $fin = StringInStr($String, $StringFin, $case, 1, $debut)
If $fin <> $debut Then
Local $realDebut = $debut + StringLen($StringDebut)
Return StringMid($String, $realDebut, $fin - $realDebut)
EndIf
EndIf
EndIf
EndIf
SetError(1);erreur parametre
Return ""
EndFunc ;==>_StringBetween2String

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mar. 05 déc. 2017 18:07
par mdanielm
Une idée:
Func Replace($aFile)
   ; $aFile = tableau des noms complets de fichiers à traiter
   ; avec en [0] le nombre
   
   local $content
   
   for $i = 1 to $aFile[0]
      $content = FileRead($aFile[$i])
      $content = StringReplace($content, "41100000 XINT", "41110000 XINT")
      FileDelete($aFile[$i])
      FileWrite($aFile[$i], $content)
   Next
EndFunc

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mer. 06 déc. 2017 10:53
par jeanbamin
Merci pour cette piste.
Je suis désolé mais en revanche quelle syntaxe dois je utiliser pour le tableau des noms complets de fichiers à traiter ?

Par ex un de mes fichiers se nomme LCM_VENTES.PNM
Faut il mettre le chemin complet des fichiers ?

Merci et encore désolé d'être aussi débutant

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mer. 06 déc. 2017 13:12
par mdanielm
; Les fichiers sont-ils tous dans le même dossier ?
; S'ils sont éparpillés et pas trop nombreux, tu peux faire ça:


Global $aFile[] = _
   [ _
      4, _   ; nbre d'éléments du tableau
      "c:\mon dossier\mes fichiers\LCM_VENTES.PNM", _
      "c:\mon dossier\mes fichiers\fich2.PNM", _
      "c:\mon dossier\mes fichiers\fich3.PNM", _
      "c:\mon dossier\mes fichiers\fich4.PNM" _
   ]
Replace($aFile)
Exit

; ici la fonction Replace
 

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mer. 06 déc. 2017 13:55
par jeanbamin
C'est parfait ça fonctionne exactement comme je le voulais.

Un grand merci

Re: [R] Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mer. 13 déc. 2017 10:19
par jeanbamin
Bonjour,
je rencontre un problème avec ce script en fait.
Les accents et certains caractères sont mal gérés et du coup mes fichiers modifiés ressortent en erreur lors des imports.
Il faut regarder le fichier en hexadecimal pour voir qu'il y a un caractère d'ajouté.

Voici ce qu'il se produit par exemple le mot chèque dans mon fichier d'origine en hexadecimal est sous la forme 43 48 C8 51 55 45
Dans le fichier une fois que le recherche/remplace s'est effectué le même mot chèque ressort 43 48 C3 88 51 55 45

Le è est donc converti de C8 vers 2 caractères hexa C3 88

Comment faire pour que le fichier d'origine ne soit pas modifié au niveau des ces caractères ?

Merci d'avance

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mer. 13 déc. 2017 16:57
par nibors
Peut-etre en ouvrant tes fichiers en précisant l'encodage ?

Je te laisse regarder du coté de la doc de fileOpen je ne l'a connais pas par coeur ^^.

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : jeu. 14 déc. 2017 11:37
par jeanbamin
Merci pour cette piste,
j'ai trouvé le bon format (128 = UTF8 avec BOM) en revanche le script me supprime les fichiers si j'utilise ce code

Code : Tout sélectionner

Func Replace($aFile)
        ; $aFile = tableau des noms complets de fichiers à traiter
        ; avec en [0] le nombre

        local $content

        for $i = 1 to $aFile[0]
			    FileOpen($aFile[$i],128)
                $content = FileRead($aFile[$i])
                $content = StringReplace($content, "41100000     XINT", "41110000     XINT")
				FileDelete($aFile[$i])
                FileWrite($aFile[$i], $content)
				FileClose($aFile[$i])
		Next
EndFunc
et les valeurs sont doublées dans mon fichier si j'utilise ce code

Code : Tout sélectionner

Func Replace($aFile)
        ; $aFile = tableau des noms complets de fichiers à traiter
        ; avec en [0] le nombre

        local $content

        for $i = 1 to $aFile[0]
			    FileOpen($aFile[$i],128)
                $content = FileRead($aFile[$i])
                $content = StringReplace($content, "41100000     XINT", "41110000     XINT")
                FileWrite($aFile[$i], $content)
				FileClose($aFile[$i])
		Next
EndFunc
Merci d'avance

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : jeu. 14 déc. 2017 15:25
par mikell
Avec FileOpen tu ne peux pas lire le fichier et y écrire en même temps. Essaye avec un petit code bien simple pour commencer

$file = FileOpen("1.PNM", 128)
$content = FileRead($file)
FileClose($file)

$content = StringReplace($content, "41100000     XINT", "41110000     XINT")

$file = FileOpen("1.PNM", 128+2)   ; 2 = overwrite
FileWrite($file, $content)
FileClose($file)
et si ça ne marche pas, poste-nous un petit fichier .PNM représentatif :wink:

Re: Rechercher remplacer plusieurs fichiers dans un dossier

Posté : mer. 24 janv. 2018 15:35
par jeanbamin
Bonjour,
désolé pour cette réponse très tardive, j'étais sur d'autres projets :D

J'ai testé le code simple et celà me va parfaitement, jel 'ai juste dupliqué autant de fois que j'avais de fichier
$file = FileOpen("1.PNM", 512)
$content = FileRead($file)
FileClose($file)

$content = StringReplace($content, "41100000     XINT", "41110000     XINT")

$file = FileOpen("1.PNM", 512+2)   ; 2 = overwrite
FileWrite($file, $content)
FileClose($file)

$file = FileOpen("2.PNM", 512)
$content = FileRead($file)
FileClose($file)

$content = StringReplace($content, "41100000     XINT", "41110000     XINT")

$file = FileOpen("2.PNM", 512+2)   ; 2 = overwrite
FileWrite($file, $content)
FileClose($file)
Je m'étais planté de format d'ailleurs le bon est en fait en ANSI soit le mode 512

Encore merci pour votre aide

Re: [R] Rechercher remplacer plusieurs fichiers dans un dossier

Posté : jeu. 25 janv. 2018 00:07
par Tlem
Bonsoir.

Puisque vous ne faites aucun contrôle d'erreur sur la lecture/l'écriture des fichiers, vous pouvez simplifier le code comme ceci :

Code : Tout sélectionner

$content = StringReplace(FileRead("1.PNM"), "41100000     XINT", "41110000     XINT")
FileWrite($file, $content)

$content = StringReplace(FileRead("2.PNM"), "41100000     XINT", "41110000     XINT")
FileWrite($file, $content)
Et tant qu'à faire, autant utiliser les fonctions qui existent :

Code : Tout sélectionner

#include <File.au3>

_ReplaceStringInFile("1.PNM", "41100000     XINT", "41110000     XINT")
_ReplaceStringInFile("2.PNM", "41100000     XINT", "41110000     XINT")