VBS Chercher et remplacer une ligne par une autre dans un fichier texte

Signaler
Messages postés
3
Date d'inscription
lundi 18 août 2008
Statut
Membre
Dernière intervention
19 août 2008
-
Messages postés
3
Date d'inscription
lundi 18 août 2008
Statut
Membre
Dernière intervention
19 août 2008
-
Bonjour,

Je suis relativement débutant en VBS, galère sur un pb que je supposais simple et tranquille au départ, en VBS :

J'ai un fichier texte avec une ligne quelque part ( ? cela varie ) qui commence par 1C... et dont la suite de la ligne peut varier
Je cherche à détecter la chaine 1C ( en début de ligne ), puis remplacer cette ligne par une autre ligne que j'aurais défini avant dans le script.

- J'ai essayé simple ; un script court avec "replace", la ligne n'est pas remplacée, en fait : la suite après "1C" est poussée vers la droite après la chaine de remplacement.

- Puis avec regex ; même pb

Je n'arrive pas à trouver comment inclure sélectionner ce qu'il y a après, et l'effacer ou remplacer

- Puis avec un do while, avec un fichier temporaire, avec strcomp, puis instr et c'est long et compliqué et je m'y perd un peu car y'a bug : la ligne à ajouter se retrouve en première ligne.

J'ai pas de solution, auriez-vous un script modèle ou une doc en ligne de référence bien faire et détaillée, avec modèles ( hors script center ) ?

Merci d'avancer pour toute info,

4 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
salut,

tu trouveras une exemple VB6 ici :
http://www.codyx.org/snippet_remplacer-chaine-autre-dans-fichier_187.aspx

puisque tu as déjà fait le code VBS, je ne pense pas que tu aies beaucoup d'adaptations à faire
++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Bonsoir,

Exemple avec dictionnaire et tableau.

Fichier .txt en entrée
22Addddddddd
21Baaaaaaaaa
1Cbbbbbbbbbb
2Axxxxxxxxxxxx
2Dzzzzzzzzzzz
2Esssss

Fichier .txt en sortie
22Addddddddd
21Baaaaaaaaa
2Dzzzzzzzzzzz
2Axxxxxxxxxxxx
2Esssss


Option Explicit
Const sFile = "F:\SCRIPTS\Fichiers\test_toulouz1.txt"
Const sVar1 = "1C"
Const sVar2 = "zzz"
Dim objFso, objFile
Dim objDico
Dim arrDicoKeys, arrDicoItems
Dim cptLineDico, cptLineVar1, cptLineVar2, i, j
Dim strResult

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile(sFile,1)
Set objDico = CreateObject("Scripting.Dictionary")

cptLineVar1 = 0
cptLineVar2 = 0

Do Until objFile.AtEndOfStream
objDico.Add cptLineDico, objFile.ReadLine : cptLineDico = cptLineDico +1
Loop
objFile.Close

arrDicoKeys = objDico.Keys
arrDicoItems = objDico.Items

For i = 0 To objDico.Count -1
If Left(arrDicoItems(i),2) sVar1 Then cptLineVar1 i
If InStr(arrDicoItems(i),sVar2) <> 0 Then cptLineVar2 = i

If cptLineVar1 <> 0 And cptLineVar2 <> 0 Then
' MsgBox arrDicoItems(cptLineVar1) &vbCrLf& arrDicoKeys(cptLineVar1) &vbCrLf& _
' arrDicoItems(cptLineVar2) &vbCrLf& arrDicoKeys(cptLineVar2)
strResult = True
Exit For
End if
Next

If strResult = True Then
objDico(cptLineVar1) = objDico.Item(cptLineVar2)
Set objFile = objFso.CreateTextFile(sFile,True)
For j = 0 To objDico.Count -1
If arrDicoKeys(j) <> cptLineVar2 Then objFile.WriteLine objDico.Item(j) &vbCr
'objFile.WriteLine objDico.Item(j) &vbcr
Next
objFile.Close
Set objFile = Nothing
End If

Set objFso = Nothing
Set objDico = Nothing



jean-marc
Messages postés
3
Date d'inscription
lundi 18 août 2008
Statut
Membre
Dernière intervention
19 août 2008

Salut,

Merci pour les exemples, et dire que j'avais envisagé de le faire en batch au début et supposé très court !

je suis en cours d'étude de l'exemple en VB qui contient la structure de départ que j'avais

et pour le deuxième, en VBS, plus compliqué, il contient des trucs qui m'intéresse ( par contre il ne fonctionne pas ; il n'atteint a priori pas le fichier. ) Et je ne sais pas si c'est la bonne méthode car c'est un script qui doit être modifié et les lignes doivent rester dans l'ordre ; elles ne sont pas classées en tableau.

Est ce qu'il est possible de suivre le déroulement d'un script ? Avec une sorte de debugger qui affiche le contenu des variables, pas à pas ?
Messages postés
3
Date d'inscription
lundi 18 août 2008
Statut
Membre
Dernière intervention
19 août 2008

Voilà le script sur lequel je travaillais et que j'ai commenté ; la base est un script avec un strcomp ( comparaison de chaines ) qui fonctionnait très bien, j'ai remplacé strcomp par instr ( et les conditions <> ), mais il écrit la ligne remplaçante au début, et même si la ligne qui doit être trouvée n'y est pas.

Y'a pt'êt un pb de définition chaine / ligne mais je ne sais pas où faire le changement car il semble que la syntaxe soit la même ?

Const Fichier = "c:\test.bat"
Const LigneCherche = "1C"
Const Ligne_remplacant = "1C nouvelle ligne "


'On error resume next
Dim f1, f2, Test_ligne, Fso
Dim ligne, ligne2, Retour


Set fso = wscript.CreateObject("scripting.filesystemobject")


                                     'opérations dans un fichier temporaire


fso.CopyFile fichier, Mid(fichier, 1, Len(fichier) - 3) & "tmp", True  '(Mid(chaine, numero lettredebut, taille) Mid ("bonjour", 2, 3) = "njo"
Set f = Fso.opentextfile(Mid(fichier, 1, Len(fichier) - 3) & "tmp", 1)  'len : Renvoie le nbr de caractères d'1 chaîne de caract ou le nbr d'octets nécessaires pour stocker une variable
Set f2 = Fso.opentextfile(fichier, 2)


 


Test_ligne = 1
Retour = False


'boucle de condition de présence de la chaine : LigneCherche dans : ligne


Do while ((Test_Ligne <> 0) and (f.AtEndOfStream <> True))   'Retourne un booléen (True ou False) indiquant si la fin de fichier est atteinte'
 ligne = f.readline


 Test_ligne = InStr(ligne, LigneCherche)   'inStr cherche une chaine incluse dans var:ligne
 
 If (test_ligne) <> 0 Then                 'si la condition est différente de 0, réécrit l'ancienne ligne
  f2.writeline Ligne
 Else
  f2.Writeline Ligne_remplacant   'si la condition est vraie applique nouvelle ligne
  Retour = True
 
 ' NOTE : LA LIGNE CI DESSUS EST ECRITE : vérifié : OK


End if
loop


 


                       'On réécrit le reste du fichier




Do While (f.AtEndOfStream = False)
 Ligne = f.readline
 f2.writeline ligne 
Loop


f2.close
f.close


fso.deletefile(Mid(fichier, 1, Len(fichier) - 3) & "tmp")
If (Retour = True) Then
 wscript.quit(0)
Else
 wscript.quit(1)
End if