VBS Chercher et remplacer une ligne par une autre dans un fichier texte
toulouz1
Messages postés3Date d'inscriptionlundi 18 août 2008StatutMembreDernière intervention19 août 2008
-
18 août 2008 à 14:32
toulouz1
Messages postés3Date d'inscriptionlundi 18 août 2008StatutMembreDernière intervention19 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 ) ?
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
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201827 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
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
toulouz1
Messages postés3Date d'inscriptionlundi 18 août 2008StatutMembreDernière intervention19 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 ?
toulouz1
Messages postés3Date d'inscriptionlundi 18 août 2008StatutMembreDernière intervention19 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