Remplacer chaine de caractere tant qu'elle existe. [Résolu]

Lokomass 191 Messages postés jeudi 7 janvier 2010Date d'inscription 15 mai 2013 Dernière intervention - 16 déc. 2009 à 14:38 - Dernière réponse : Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention
- 16 déc. 2009 à 15:54
Bonjour,

Encore une question bizarre lol.
J'ai récupéré une fonction qui me permet de rechercher une chaine de caractère dans un fichier texte, et de la remplacer par une autre.

Public Function ChangeWords(sWordsToRemove As String, sWordsToChange As String, sFile As String) As Boolean
    If Dir(sFile, vbSystem Or vbHidden) = vbNullString Then
        ChangeWords = False
    Else
        Dim FF As Integer, sBuffer As String
        FF = FreeFile
        Open sFile For Input As #FF
            sBuffer = Input(LOF(FF), 1)
        Close #FF
        Dim lPos As Long
        lPos = InStr(1, sBuffer, sWordsToRemove)
        If lPos = 0 Then
            ChangeWords = False
        Else
                Dim sFirst As String, sLast As String
                sFirst = Left$(sBuffer, lPos - 1)
                sLast = Right$(sBuffer, Len(sBuffer) - lPos - Len(sWordsToRemove) + 1)
                FF = FreeFile
                Open sFile For Output As #FF
                Print #FF, sFirst & sWordsToChange & sLast
                Close #FF
                ChangeWords = True
        End If
    End If
End Function



Cette fonction marche très bien, le seul soucis, c'est qu'il ne teste qu'une seule fois la chaîne. Si elle se trouve deux fois dans le fichier texte, alors il ne remplacera que la première.
J'ai essayé de modifier cette fonction de manière à ce qu'elle modifie toutes les chaînes de caractères présentes dans le fichier, mais cela ne fonctionne pas.

Public Function ChangeWords(sWordsToRemove As String, sWordsToChange As String, sFile As String) As Boolean
    If Dir(sFile, vbSystem Or vbHidden) = vbNullString Then
        ChangeWords = False
    Else
        Dim FF As Integer, sBuffer As String
        FF = FreeFile
        Open sFile For Input As #FF
            sBuffer = Input(LOF(FF), 1)
        Close #FF
        Dim lPos As Long
        lPos = InStr(1, sBuffer, sWordsToRemove)
        If lPos = 0 Then
            ChangeWords = False
        Else
            While lPos > 0
                Dim sFirst As String, sLast As String
                sFirst = Left$(sBuffer, lPos - 1)
                sLast = Right$(sBuffer, Len(sBuffer) - lPos - Len(sWordsToRemove) + 1)
                FF = FreeFile
                Open sFile For Output As #FF
                Print #FF, sFirst & sWordsToChange & sLast
                Close #FF
                ChangeWords = True
                lPos = lPos - 1
            Wend
        End If
    End If
End Function


Je sais, j'ai pas modifier grand chose.. Mais bon ça ne fonctionne apparemment pas.
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Claiyah 580 Messages postés mercredi 20 août 2008Date d'inscription 20 avril 2010 Dernière intervention - 16 déc. 2009 à 15:25
3
Merci
sa va remplacer tout les mots

Merci Claiyah 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Claiyah
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 déc. 2009 à 14:59
0
Merci
Juste une question :
cette nouvelle discussion fait-elle suite à celle que tu as ouverte ici ? :
http://www.vbfrance.com/forum/sujet-SUPPRIMER-TOUT-CARACTERES-APRES-MOT-DANS-FICHIER-TEXTE_1386965.aspx
Si oui :
- c'est dans cette optique, précisément que je t'avais posé la question suivante resdtée sans réponse :
Et quid si, plus loin, tu as encore un ou des ! ?
- il faut alors (bien plus adroit) complètement modifier la stratégie adoptée, de A à Z

Mais nous n'y irons qu'après réponse cette fois précise et complète, afin d'éviter un nouveau malentendu
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Commenter la réponse de ucfoutu
Claiyah 580 Messages postés mercredi 20 août 2008Date d'inscription 20 avril 2010 Dernière intervention - 16 déc. 2009 à 14:59
0
Merci
si tu veut remplacer tout alors tu utilise juste l'instruction "Replace"
Commenter la réponse de Claiyah
Lokomass 191 Messages postés jeudi 7 janvier 2010Date d'inscription 15 mai 2013 Dernière intervention - 16 déc. 2009 à 15:08
0
Merci
Alors, en fait non, ça n'a pas grand chose à voir.
Si tu veux, je récupère ce que le Switch me renvoi comme configuration.
Moi je récupère tout est le met dans un fichier texte.
Seulement dans ce fichier texte, il y a quelques caractères qui apparaissent et que je ne veux pas garder. Ce fichier doit pouvoir être renvoyer tel quel dans d'autres Switch. Il faut donc que la syntaxe soit parfaite et sans erreur.

Un morceau de fichier que je récupère :

"
Catalyst_2950#show running-config
Building configuration...

Current configuration : 6430 bytes
!
version 12.1
no service pad
service timestamps debug uptime
service timestamps log uptime
service password-encryption
!
hostname Catalyst_2950
!
enable password 7 14341B180F0B
!
username ftamp33 privilege 15 password 7 06001B2041"
"5E5A4A
username toto privilege 4 password 7 01070F1052
username ftamp332 privilege 15 password 7 08731E1D2C
ip subnet-zero
!
no ip domain-lookup
ip domain-name Toto
ip ssh time-out 60
ip ssh authentication-retries 2
!
 --More--         !
spanning-tree mode pvst


Moi ce que je veux, c'est virer tous les truc qui me gênent avec une seule commande. Par exemple, pour virer le "--More--" qui apparaît je ne sais combien de fois dans le fichier, je faisait :


For i = 0 To 40
Call ChangeWords("--More--", "", FileName)
Next


C'est pas très propre, surtout que si il apparait plus de 40 fois, il en restera.

Voilà pourquoi je cherche à virer ce genre de choses qui me gênent d'un seul coup.

Si je ne suis encore pas clair, dit me le ucfoutu mais j'essaye de bien faire là :)
Commenter la réponse de Lokomass
Claiyah 580 Messages postés mercredi 20 août 2008Date d'inscription 20 avril 2010 Dernière intervention - 16 déc. 2009 à 15:19
0
Merci
Function remplacerr(tachaine As String, motavirer As String, motaajouter As String) As String
remplacerr = Replace(tachaine, motavirer, motaajouter)
End Function


exemple d'utilisation :
Dim machaine As String, monmot As String, newmot As String
machaine = Text1.Text
monmot = "Else"
newmot = ""
Text2.Text = remplacerr(machaine, monmot, newmot)
Commenter la réponse de Claiyah
Lokomass 191 Messages postés jeudi 7 janvier 2010Date d'inscription 15 mai 2013 Dernière intervention - 16 déc. 2009 à 15:22
0
Merci
Merci,

Mais c'est toujours le même problème, il va remplacer la première fois qu'il trouve le motif, et pas remplacer TOUS les motifs du fichier texte ?
Commenter la réponse de Lokomass
Lokomass 191 Messages postés jeudi 7 janvier 2010Date d'inscription 15 mai 2013 Dernière intervention - 16 déc. 2009 à 15:44
0
Merci
Merci beaucoup, ça fonctionne à merveille.

Voilà le code pour ceux que ça peut aider :

Public Function RemplaceMoi(sWordsToRemove As String, sWordsToChange As String, sFile As String)
Dim FF As Integer, sBuffer As String
FF = FreeFile
Open sFile For Input As #FF
    sBuffer = Input(LOF(FF), 1)
Close #FF
sBuffer = EnleveOh(sBuffer, sWordsToRemove, sWordsToChange)
FF = FreeFile
Open sFile For Output As #FF
Print #FF, sBuffer
Close #FF
End Function

Public Function EnleveOh(sChaine As String, sWordsToRemove As String, sWordsToChange As String) As String
EnleveOh = Replace(sChaine, sWordsToRemove, sWordsToChange)
End Function
Commenter la réponse de Lokomass
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 16 déc. 2009 à 15:53
0
Merci
Claiyah te taquinait, tu as plongé...

a quoi te sert ElenveOh ? utilises Replace directement....

dans ton précedent Post, je t'ai indiqué de faire gaffe a bien placer un ; ala fin de ton Print dans ton fichier, sous peine d'ajouter un saut de ligne peut etre non désiré

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Commenter la réponse de Renfield
Renfield 17308 Messages postés mercredi 2 janvier 2002Date d'inscription 22 août 2018 Dernière intervention - 16 déc. 2009 à 15:54
0
Merci
j'ajouterai que si tous ces changement interviennent sur le même fichier, faits les intelligemment. Pas utile (et long) de carger, écraser n fois le fichier plutot que de tout faire en une passe, en mémoire.

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.