Remplacer chaine de caractere tant qu'elle existe.

Résolu
Lokomass Messages postés 191 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 15 mai 2013 - 16 déc. 2009 à 14:38
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 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.

9 réponses

Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 déc. 2009 à 15:25
sa va remplacer tout les mots
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2009 à 14:59
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.
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 déc. 2009 à 14:59
si tu veut remplacer tout alors tu utilise juste l'instruction "Replace"
0
Lokomass Messages postés 191 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 15 mai 2013 1
16 déc. 2009 à 15:08
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à :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 déc. 2009 à 15:19
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)
0
Lokomass Messages postés 191 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 15 mai 2013 1
16 déc. 2009 à 15:22
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 ?
0
Lokomass Messages postés 191 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 15 mai 2013 1
16 déc. 2009 à 15:44
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 déc. 2009 à 15:53
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 déc. 2009 à 15:54
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
0
Rejoignez-nous