[R] remplacer une valeur précise dans un fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

[R] remplacer une valeur précise dans un fichier

#1

Message par guillaume »

Bonjour,


J'ai récupéré sur ce site un script qui permet de faire un "remplacer" dans un fichier texte.

Je cherche à l'adapter pour ne faire le remplacement que de certaines occurrences.

Par exemple, je voudrais modifier le texte seulement à la 3ième ou enième occurrence.

ce qui donnerait par exemple :

avant modif du txt :
texte1
texte1
texte1
texte1

Après modif en changeant que le 3ième :
texte1
texte1
texte2
texte1


Je pense qu'il faut utiliser une boucle ? ou un index ?


Voici le code de base

Code : Tout sélectionner

#include-once
#Include <File.au3>

Dim $SFile, $EN, $FR, $Res, $StrErr, $GErr
; Mise à jour du fichier Date.au3, pour afficher les jours et mois en Francais.
$SFile = "C:\test\fichier.txt"
$ancien = 'texte1|'
$nouveau = 'texte2|'
$Res = _FUpdate($SFile, $ancien, $nouveau, $StrErr)
$compteur= 2
If $Res = 0 Then $GErr = 1



Func _FUpdate($SFile, $Str1, $Str2, ByRef $StrErr, $fCaseness = 0)
    ; Vérification de la présence du fichier (Sinon pas la peine de continuer).
    If Not FileExists($SFile) Then Return 0

    ; Récupération des attributs du fichier pour les remettres plus tard
    $attrib = FileGetAttrib($SFile)
    ; Modification des attributs, pour pouvoir écrire dedans.
    $Res = FileSetAttrib($SFile, "-RASH")
    ; Si le changement des attributs s'est mal déroulé, alors on sort.
    If $Res = 0 Then Return 0

    ; Mise en tableau des valeurs à remplacer et de remplacement.
    $Str1 = StringSplit($Str1, "|")
    $Str2 = StringSplit($Str2, "|")

    ; Si il n'y à pas le meme nombre d'argument, on remet les attributs, et on sort.
    If $Str1[0] <> $Str2[0] Then
        FileSetAttrib($SFile, "+" & $attrib)
        Return 0
    EndIf

    ; Boucle de remplacement dans le fichier.
    Dim $Err = 0

    For $i = 1 To $Str1[0]
        $Res = _ReplaceStringInFile($SFile, $Str1[$i], $Str2[$i], $fCaseness)
        ; Si la chaine n'a pas été remplacée, incrémentation de la variable $Err.
        If $Res <= 0 Then
            $Err = $Err + 1
            $StrErr = $StrErr & $Str1[$i] & " => " & $Str2[$i] & @CRLF
        EndIf
    Next

    ; Remise en place des attributs
    FileSetAttrib($SFile, "+" & $attrib)
    ; Pour indiquer que le fichier à été mofifier.
    FileSetAttrib($SFile, "-A")

    ; Retourne le nombre de remplacement non effectué.
    SetError($Err)
    ; Indique que des remplacements ont été effectués.
    Return 1

EndFunc   ;==>_FUpdate


exit

Merci pour votre aide
Modifié en dernier par guillaume le lun. 29 août 2011 20:09, modifié 1 fois.
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#2

Message par PandiPanda »

► Afficher le texte
Vous n'auriez qu'a lire un fichier, efffectuer la fonction et réecrire? :P
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#3

Message par guillaume »

Bonjour,

oui merci c'est à peu près ça que je veux. :)

Le script me parait beaucoup plus simple que celui que j'avais trouvé.

Si je veux utiliser cette fonction avec un fichier texte et l'écraser avec le nouveau contenu ça donnerait quoi ?

Je suis en train de chercher, mais je débute alors si je peux gagner quelques heures !

Merci en tout cas
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#4

Message par PandiPanda »

ca donnerai quelque chose comme ceci :P
► Afficher le texte
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#5

Message par guillaume »

merci beaucoup, mais il y a un truc qui ne va pas quelque part.
Mon fichier n'est pas modifié.

ça fonctionne chez vous ?
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#6

Message par PandiPanda »

metter le script que vous utilisé ici ^^
peut etre une erreur
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#7

Message par guillaume »

voilà :

Code : Tout sélectionner

#include-once
#Include <File.au3>
Global $file,$str,$path
$path="c:\test\fichier.txt"
$file=FileOpen($path,0+1);on ouvre en mode lecture et ecriture
$str=FileRead($file); on lit le fichier

FileWrite($file,_strOccurReplace($str,"val1","50",4)); on ecrit le fichier avec ce que vous voulez :p

Func _strOccurReplace($str,$strFind,$strReplace,$occurance);permet de faire ce quze vous voulez
    Local $ArrayTmp=StringSplit($str,$strFind,1)
    Local $string=''
    For $i=1 To $ArrayTmp[0]-1
        If $i=$occurance Then
            $string=$string&$ArrayTmp[$i]&$strReplace
        Else
            $string=$string&$ArrayTmp[$i]&$strFind
        EndIf
    Next
    Return $string&$ArrayTmp[$ArrayTmp[0]]
EndFunc

exit
mon fichier texte contient bien plusieurs fois le terme "val1" mais rien ne change
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#8

Message par PandiPanda »

c'est moi qui est mal fait, désoler :P

essayer ceci;
► Afficher le texte
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [..] remplacer une valeur précise dans un fichier

#9

Message par guillaume »

Génial, merci beaucoup pour votre aide et votre reactivité !
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [R] remplacer une valeur précise dans un fichier

#10

Message par guillaume »

Je rencontre un problème quand mon fichier TXT contient des accents.

Après avoir cherché un peu j'ai vu que Filewrite ne gérait par les accents et qu'il fallait utiliser FileOpen : " To write in Unicode mode the file must be opened with FileOpen() and the relevant flags"

est ce que ça veut dire qu'il faut que j'utilise FileOpen à la place de Fileread ou à la place de Filewrite ?

Je ne suis pas sur d'avoir bien compris.

Merci
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [R] remplacer une valeur précise dans un fichier

#11

Message par PandiPanda »

Voici ^^
► Afficher le texte
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
guillaume
Niveau 4
Niveau 4
Messages : 68
Enregistré le : mar. 28 août 2007 12:13
Status : Hors ligne

Re: [R] remplacer une valeur précise dans un fichier

#12

Message par guillaume »

excellent !

Merci :)
ELGAMALI
Niveau 5
Niveau 5
Messages : 184
Enregistré le : mar. 13 sept. 2011 00:06
Status : Hors ligne

Re: [R] remplacer une valeur précise dans un fichier

#13

Message par ELGAMALI »

Bonjour à toutes et à tous
Mon petit fils a remarqué une petit erreur sans signification que je porte à votre connaissance : il faut rectifier la valeur 3 par 1 de la fonction FileWrite($file,_strOccurReplace($str,"coucou","plop",1)) pour que votre scripte marche comme prévu.
a+
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] remplacer une valeur précise dans un fichier

#14

Message par mikell »

@Panda
Tu oublies le monde merveilleux du regexp :mrgreen:
Exemple :

Code : Tout sélectionner

$str = "le premier chat le 2ème chat le 3ème chat le 4ème chat etc etc"

[color=#008000]; on remplace la 3e occurence de 'chat' par 'chien' :[/color]
Msgbox(0,"", StringReplaceOcc($str, "chat", "chien", 3) )

Func StringReplaceOcc($string, $out, $in, $occur)
   Return StringRegExpReplace ($string, '(?s)(?:.*?\K' & $out & '){' & $occur & '}' , $in )  
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre