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

toulouz1 Messages postés 3 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 19 août 2008 - 18 août 2008 à 14:32
toulouz1 Messages postés 3 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 19 août 2008 - 19 août 2008 à 11:34
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

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 août 2008 à 14:43
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  
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
18 août 2008 à 21:38
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
0
toulouz1 Messages postés 3 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 19 août 2008
19 août 2008 à 08:43
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 ?
0
toulouz1 Messages postés 3 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 19 août 2008
19 août 2008 à 11:34
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
0
Rejoignez-nous