IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Problème de modification d'une chaine de caractères spécifques dans un fichier


Sujet :

VBScript

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Problème de modification d'une chaine de caractères spécifques dans un fichier
    Bonjour,

    voilà mon soucis. dans un fichier .ini, j'ai quelque part une ligne qui est du style KEYNAME=\\NOMSERVEUR\NOMPARTAGE\NOM.ID

    je voudrai faire un script qui me remplacerait cette ligne par : KEYNAME=\\NOMSERVEUR\NOMPARTAGE\NOM\NOM.ID

    Voilà... comme je suis débutant en VBscript, je n'y arrive pas..

    merci pour votre aide.

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    RE-BIENVENU sur DVP;

    Teste ce bout de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Const ForReading = 1, ForWriting = 2
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    set f = fso.OpenTextFile("Fichier.ini", ForReading , False)
    NouveauText=""
     DO While Not F.AtEndOfStream
       LigneLue = F.ReadLine
       If InStr( 1, LigneLue, "KEYNAME=\\NOMSERVEUR\NOMPARTAGE\NOM.ID")> 0 Then 
       'totalité de la ligne au cas où il y aurait d'autres occurences qu'on veut garder
       ' sinon on fait : If InStr( 1, LigneLue, "\NOMP.ID")> 0 Then
          LigneLue = Replace(LigneLue, "\NOM.ID", "\NOM\NOM.ID")
          'ou encore : LigneLue = "KEYNAME=\\NOMSERVEUR\NOMPARTAGE\NOM\NOM.ID"
       End If
       NouveauText = NouveauText & LigneLue & vbNewLine
     Loop 
     F.Close
     set f = fso.OpenTextFile("Fichier.ini", ForWriting , False)
     F.Write NouveauText
     F.Close
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci pour ton aide.

    cela dit, j'ai certainement mal précisé que NOM.ID est une valeur que je ne connais pas et qu'en fait je veux intégré ce NOM en tant que nom de répertoire avant mon nom de fichier NOM.ID.

    J'espère que je suis plus clair.

    merci.

  4. #4
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    J'espère que je suis plus clair..
    Pas du tout, tu ne fais que répéter ce que tu as écrit dans le post #1.

    Serait-il possible d'avoir un autre exemple à partir du fichier ini et, en plus, les modifications attendues
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    En fait j'ai cru bon de préciser car dans ton code tu mets : LigneLue = Replace(LigneLue, "\NOM.ID", "\NOM\NOM.ID") et NOM en tant que chaine et pas variable or je ne vois pas comment tu extrais la valeur NOM de NOM.ID. tu vois ce que je veux dire?

    en fait si j'ai KEYNAME=\\NOMSERVEUR\NOMPARTAGE\toto.ID je veux retrouver KEYNAME=\\NOMSERVEUR\NOMPARTAGE\toto\toto.ID
    ou encore
    si j'ai KEYNAME=\\NOMSERVEUR\NOMPARTAGE\titi.ID je veux retrouver KEYNAME=\\NOMSERVEUR\NOMPARTAGE\titi\titi.ID

  6. #6
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    La fonction InStrRev() permet de récupérer la position d'uns sous-chaine dans une chaine en partant de la fin.
    Donc, tu cherches la position du "/" et la fonction Mid() te permettra d'isoler la chaine que tu souhaites.

  7. #7
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Bonjour;
    Là, cela devient plus clair .
    Voici le script modifié pour répondre à ta demande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Const ForReading = 1, ForWriting = 2
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    set f = fso.OpenTextFile("Fichier.ini", ForReading , False)
    NouveauText=""
     DO While Not F.AtEndOfStream
       LigneLue = F.ReadLine
       If LigneLue <> "" Then 
           longueur =  InstrRev( LigneLue, "\") 
           Restedelachaine = Mid(LigneLue, Longueur+1)
           NomAjout = Mid(Restedelachaine, 1, InstrRev(Restedelachaine, ".") - 1)
           LigneLue = Left(LigneLue, Longueur) & NomAjout & "\" & Mid(Restedelachaine, 1)
           NouveauText = NouveauText & LigneLue & vbNewLine
        Else ' Pour garder la structure générale du fichier
           NouveauText = NouveauText & LigneLue & vbNewLine
        End If
     Loop 
     F.Close
     set f = fso.OpenTextFile("Fichier.ini", ForWriting , False)
     F.Write NouveauText
     F.Close
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Je comprends de mieux en mieux mais malgré tout j'ai plusieurs ligne dans mon fichier .ini qui contiennent des "\" par contre ma ligne commence toujours par KeyFilename=\\STNT0061\IDNOT061$\toto.id (sachant que toto.id n'est pas une constante)

    alors je me disais que si je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Left(LigneLue, 34) = "KeyFilename=\\STNT0061\IDNOT061$\" Then
        nomid = Mid(LigneLu, 22, 8)
        NouveauText = NouveauText & Left(LigneLue, 34) & nomid & "\" & nomid & ".ID"
    End If
    qu'en pensez vous ?

    mais je ne sais pas exactement comment l'intégrer par rapport au restes des lignes lues et surtout par rapport à l'écriture dans le fichier ensuite

  9. #9
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Il y a un peu de contradiction dans ton post : d'une part tu dis qu'il y a des valeurs non constantes, d'autre part tu écris :

    If Left(LigneLue, 34) = "KeyFilename=\\STNT0061\IDNOT061$\" Then qui suppose que la chaine est constante.

    Allons-y pas à pas :
    1 - Place une copie de ton fichier ini dans le même dossier que le script et renomme-la en Fichier.ini
    2 - Exécute ensuite le dernier code que j'ai envoyé
    3 - Ouvre ensuite ton "Fichier.ini" et regarde si les modifications qui y sont faites correspondent bien à ce que tu attends ou non.
    4 - Dans le cas où il y aurait discordance, envoie la partie du "Fichier.ini" faisant défaut.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  10. #10
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    tu peux utiliser les Regexp's pour cette tâche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Set fso = CreateObject("Scripting.FileSystemObject")
    path = "test.txt"
    text = fso.OpenTextFile(path,1).ReadAll
    set rx = New Regexp
    With rx
       .global = true
       .ignorecase=True
       .pattern = "(\bKeyFilename=\\\\STNT0061\\IDNOT061\$\\)(([^.]+)[.].+)"
    End With
     
    N = rx.replace(text,"$1$3\$2")
    set f = fso.OpenTextFile(path, 2 , False)
    f.Write N
    f.Close
    j'ai copié un peu le code de l_autodidacte faute de temps.

  11. #11
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    alors je suis désolé l'autodidacte mais ton en exécutant ton code, j'ai une erreur sur le mid.

    par contre le code de i'm here fonctionne. Je ne connais absolument pas regexp's mais ça marche bien. merci beaucoup.

    2 solutions, est que tu veux qu'on finisse aussi avec ton code l'autodidacte ou on s'arrete là... franchement perso j'aimerai bien aller au bout... ne serait ce que pour bien comprendre ...
    donc quand je dis constante, je veux dire que pour n'importe quel fichier .ini que je traite , "KeyFilename=\\STNT0061\IDNOT061$\" y est toujours avec seulement la fin qui change... et ce code doit s'appliquer sur n'importe quel .ini

    encore merci pour votre implication

  12. #12
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2011
    Messages : 163
    Points : 304
    Points
    304
    Par défaut
    Salut !

    Je n'ai pas suivi toute la discussion, mais à priori, l'erreur de syntaxe est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomid = Mid(LigneLue, 22, 8)
    ++

  13. #13
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    J'espère qu'avec le code commenté tu arrives à comprendre le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Option Explicit
     
    '  déclaration des variables :
    Const ForReading = 1, ForWriting = 2
    Dim fso, f, NouveauText, LigneLue, longueur, Restedelachaine, NomAjout
     'Creation d'une instance de l'objet FileSystemObject
    Set fso = CreateObject("Scripting.FileSystemObject")
    'Creation de l'objet File(fichier à lire et plus bas à éditer
    set f = fso.OpenTextFile("Fichier.ini", ForReading , False)
    NouveauText="" ' Initialisation du texte à écrire plus tard dans le fichier
     DO While Not F.AtEndOfStream ' On lit le fichier tant qu'on n'est pas arrivé à la fin
       LigneLue = F.ReadLine ' lecture ligne par ligne
       If LigneLue <> "" Then  ' condition sur la ligne lue (LigneLue) si elle n'est pas vide
           longueur =  InstrRev(LigneLue, "\") ' on récupère la position du dernier caractère \ et 
                                               ' là quelle que soit le contenu de la ligne pourvu qu'il y ait le caractère \
                                               ' donc pas besoin de se limiter une longueur donnée de la chaine 
           Restedelachaine = Mid(LigneLue, Longueur+1) ' On récupère le reste de la chaine juste après le \
           NomAjout = Mid(Restedelachaine, 1, InstrRev(Restedelachaine, ".") - 1) ' on récupère le dernier nom sans extension
           LigneLue = Left(LigneLue, Longueur) & NomAjout & "\" & Restedelachaine ' on réécrit la ligne lue en y ajoutant
            ' le nom qu'on vient de récupérer (NomAjout)
           NouveauText = NouveauText & LigneLue & vbNewLine ' On met le résultat dans la variable NouveauText
        Else ' Pour garder la structure générale du fichier
           NouveauText = NouveauText & LigneLue & vbNewLine ' ici on ne fait que copier une ligne vide s'il y en a une
        End If
     Loop 
     F.Close ' on ferme le fichier en lecture
     set f = fso.OpenTextFile("Fichier.ini", ForWriting , False) 'on ouvre le fichier en écriture
     F.Write NouveauText ' On y met le nouveau contenu(avec les modifications nécessaires)
     F.Close ' on ferme le fichier pour l'enregistrer
    Si tu as toujours l'erreur au niveau de la fonction Mid, essaie de préciser le type d'erreur et regarde dans le fichier ini s'il n'y a pas quelque chose qui engendre celle-ci.
    Pour ma part, je l'ai testé et cela fonctionne très bien.
    Une chose importante à te dire : Prends toujours l'habitude d'utiliser la clause Option Explicit au début de ton script; cela te permet entre-autres de voir si tu correctement tapé le nom d'une variable , fonction, procédure(Sub) ... ou non.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

Discussions similaires

  1. [Batch] Rechercher et renommer une chaine de caractère complexe dans un fichier texte
    Par mrcanardwc dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 24/06/2011, 13h02
  2. Réponses: 4
    Dernier message: 10/07/2008, 13h34
  3. Modification d'une chaine de caractères
    Par banju dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2008, 12h07
  4. modification d'une chaine de caractère
    Par rlongin dans le forum SAS Base
    Réponses: 2
    Dernier message: 21/05/2008, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo