[R] Rechercher remplacer plusieurs fichiers dans un dossier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jeanbamin
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mar. 05 déc. 2017 14:39
Status : Hors ligne

[R] Rechercher remplacer plusieurs fichiers dans un dossier

#1

Message 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
Modifié en dernier par jeanbamin le mer. 24 janv. 2018 15:35, modifié 3 fois.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#2

Message 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
jeanbamin
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mar. 05 déc. 2017 14:39
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#3

Message 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
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#4

Message 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
 
jeanbamin
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mar. 05 déc. 2017 14:39
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#5

Message par jeanbamin »

C'est parfait ça fonctionne exactement comme je le voulais.

Un grand merci
jeanbamin
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mar. 05 déc. 2017 14:39
Status : Hors ligne

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

#6

Message 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
nibors
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 17 oct. 2016 15:54
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#7

Message 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 ^^.
jeanbamin
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mar. 05 déc. 2017 14:39
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#8

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#9

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
jeanbamin
Niveau 1
Niveau 1
Messages : 6
Enregistré le : mar. 05 déc. 2017 14:39
Status : Hors ligne

Re: Rechercher remplacer plusieurs fichiers dans un dossier

#10

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

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

#11

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