Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
890 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBS] Supprimer un bloc de lignes

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBS] Supprimer un bloc de lignes

n°2047146
slr56
Tout problème a sa solution.
Posté le 07-01-2011 à 11:06:50  profilanswer
 

Bonjour,

 

je veux supprimer dans un fichier ini, un bloc de lignes donc la première commence par une section et la dernière est une ligne vide.

 

J'ai déjà fait ce morceau de script qui permet de supprimer une ligne en particulier :

Code :
  1. Const ForReading = 1
  2. Const ForWriting = 2
  3. Set objFSO = CreateObject("Scripting.FileSystemObject" )
  4. Set objFile = objFSO.OpenTextFile("D:\script\simul.txt", ForReading)
  5. Do Until objFile.AtEndOfStream
  6.     strLine = objFile.ReadLine
  7.     If InStr(strLine, "ligne a supprimer" ) = 0 Then
  8.         strNewContents = strNewContents & strLine & vbCrLf
  9.     End If
  10. Loop
  11. objFile.Close
  12. Set objFile = objFSO.OpenTextFile("D:\script\simul.txt", ForWriting)
  13. objFile.Write strNewContents
  14. objFile.Close
 

Maintenant, comment supprimer un "bloc"? Dans le fichier INI suivant, je veux supprimer tout ce qui concerne la section Office 2007 :

Code :
  1. [Office 2007]
  2. UPDATED0001=patch 001
  3. UPDATED0002=Update files
  4. UPDATED0003=Excel 2007
  5. UPDATED0005=Access 2007
  6. [Symantec Antivirus 9.03]
  7. INSTALL=Symantec Antivirus 9.03
  8. UPDATED0001=Uninstall previous Antivirus version
  9. UPDATED0002=Install Symantec Antivirus 9.03
 

En gros, je voudrais traduire en code : Je trouve la section Office 2007, tant que la ligne en cours de lecture n'est pas vide, je la supprime.

 


Merci de votre aide. :)


Message édité par slr56 le 07-01-2011 à 13:45:44
mood
Publicité
Posté le 07-01-2011 à 11:06:50  profilanswer
 

n°2047226
slr56
Tout problème a sa solution.
Posté le 07-01-2011 à 13:45:54  profilanswer
 

up s'il vous plait.

n°2047234
gzii
court-circuit
Posté le 07-01-2011 à 13:58:52  profilanswer
 

Un truc du genre ?

Code :
  1. prendre = vrai
  2. tant que pas fin du fichier:
  3.   lire ligne
  4.   si ligne = entete de bloc recherchée:
  5.     prendre = faux
  6.   si prendre:
  7.     ecriture de la ligne
  8.   sinon:
  9.     si ligne vide:
  10.       prendre = vrai

Message cité 1 fois
Message édité par gzii le 07-01-2011 à 14:00:10
n°2047254
slr56
Tout problème a sa solution.
Posté le 07-01-2011 à 14:24:06  profilanswer
 

gzii a écrit :

Un truc du genre ?

Code :
  1. prendre = vrai
  2. tant que pas fin du fichier:
  3.   lire ligne
  4.   si ligne = entete de bloc recherchée:
  5.     prendre = faux
  6.   si prendre:
  7.     ecriture de la ligne
  8.   sinon:
  9.     si ligne vide:
  10.       prendre = vrai



 
Oui. C'est ça.

n°2047262
gzii
court-circuit
Posté le 07-01-2011 à 14:27:04  profilanswer
 

Ben je crois que tu as tous les éléments. Pour le langage je ne peux pas te renseigner, pas envie d'apprendre le VBS.

n°2047279
slr56
Tout problème a sa solution.
Posté le 07-01-2011 à 14:43:48  profilanswer
 

Pour supprimer une ligne, il n'y a pas de problème. En revanche, je ne vois pas comment dire à partir de la ligne que j'ai trouvé (la ligne de début de bloc), supprimer toutes les lignes (première de bloc incluse) jusqu'à la prochaine ligne vide.


Message édité par slr56 le 07-01-2011 à 14:44:16
n°2047281
gzii
court-circuit
Posté le 07-01-2011 à 14:45:19  profilanswer
 

une variable booléenne prendre que tu mets à vrai ou faux comme ce que je t'ai dit, et à vrai en tout début.


Message édité par gzii le 07-01-2011 à 14:45:37
n°2047463
slr56
Tout problème a sa solution.
Posté le 07-01-2011 à 19:52:52  profilanswer
 

Je suis rendu à ça mais malheureusement, ça ne fonctionne toujours pas. Ca supprime tout les lignes de mon fichier. Comment ne supprimer que la portion suivante :
 
[Office 2007]
UPDATED0001=patch 001
UPDATED0002=Update files
UPDATED0003=Excel 2007
UPDATED0005=Access 2007
 

Code :
  1. Const ForWriting = 2
  2. take = false
  3. Set objFSO = CreateObject("Scripting.FileSystemObject" )
  4. Set objFile = objFSO.OpenTextFile("fichier.ini" )
  5. While Not objFile.AtEndOfStream
  6.     strLine = objFile.ReadLine
  7.     If InStr(strLine, "Symantec Antivirus" ) = 0 Then
  8. take = true
  9. End if
  10. If take = true then
  11.  Set objFile = objFSO.OpenTextFile("fichier.ini", ForWriting)
  12.  Do While strLine <> ""
  13.    strLine = ""
  14.  Loop
  15.  objFile.Close
  16. End if
  17. take = false
  18. Wend
  19. objFile.Close
  20. Set objFile = Nothing



Message édité par slr56 le 07-01-2011 à 19:55:07
n°2047518
gzii
court-circuit
Posté le 08-01-2011 à 02:52:14  profilanswer
 

C'est pas du tout ce que j'ai écrit.
Pourquoi tu ouvres et tu fermes ton fichier plein de fois ?
 
C'est quoi ce truc ?!! :lol:
Je n'ai pas l'impression que tu comprennes ce que tu fais là. Si ?

n°2047547
slr56
Tout problème a sa solution.
Posté le 08-01-2011 à 13:57:56  profilanswer
 

La prog n'a jamais été mon fort. ^^
Ce qu'il faut, c'est que j'ouvre le fichier en lecture pour mettre le curseur sur le titre de la section que je cherche et ensuite que je passe en mode écriture pour supprimer les lignes dont je ne veux plus.
 
Or ce n'est pas ça que j'ai fait.
 
Où faut-t-il que j'ouvre le fichier en écriture pour faire les modifications nécessaires?

mood
Publicité
Posté le 08-01-2011 à 13:57:56  profilanswer
 

n°2047549
gzii
court-circuit
Posté le 08-01-2011 à 14:14:29  profilanswer
 

Tu lis un fichier et en écris un qui remplace le premier.
Donc il faudrait, comme dans le premier programme, stocker ce que tu lis et que tu veux dans une variable, et à la fin l'écrire dans le fichier. Ça ça ne change pas.
quand j'ai mis écriture de la ligne, c'est plutôt ajout de la ligne dans la variable.
 
Maintenant, je pense que ce serait pas mal que tu reviennes un peu en arrière pour apprendre les bases.


Message édité par gzii le 08-01-2011 à 14:15:55
n°2048603
slr56
Tout problème a sa solution.
Posté le 13-01-2011 à 09:55:54  profilanswer
 

Bonjour,

 

je reviens sur ce sujet car j'ai réussi à faire le script que je voulais. Cependant, je voudrais l'optimiser.

Code :
  1. strComputer = "."
  2. Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2" )
  3. Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem",,48)
  4. For Each objItem in colItems
  5. os_version = os_version & objItem.version
  6. Next
  7. If InStr(1,os_version,"6.1" ) then
  8. strFileName = "C:\Program Files\infos\fichier1.ini"
  9. Else If InStr(1,os_version,"5.1" ) then
  10.  strFileName = "C:\Program Files\infos\fichier2.ini"
  11. End If
  12. End If
  13. 'Delete Lines of a Text File Beginning
  14. set objWS = CreateObject("Wscript.Shell" )
  15.      
  16.         Set fsob=CreateObject("Scripting.FileSystemObject" )
  17. Const FOR_READING = 1
  18. Const FOR_WRITING = 2
  19. strCheckForString0 = UCase("" )
  20. strCheckForString1 = UCase("" )
  21. strCheckForString2 = UCase("" )
  22. Set objFS = CreateObject("Scripting.FileSystemObject" )
  23. Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
  24. strContents = objTS.ReadAll
  25. objTS.Close
  26. arrLines = Split(strContents, vbNewLine)
  27. Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)
  28. For Each strLine In arrLines
  29.   If Not(Left(UCase(LTrim(strLine)),Len(strCheckForString0)) = strCheckForString0) Then 
  30.      objTS.WriteLine strLine
  31.   End If
  32. Next
  33. set objFS=nothing
  34. Set objTS=nothing
  35. Set arrLines=nothing
  36. Set strCheckForString0=nothing
  37. Set objFS = CreateObject("Scripting.FileSystemObject" )
  38. Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
  39. strContents = objTS.ReadAll
  40. objTS.Close
  41. arrLines = Split(strContents, vbNewLine)
  42. Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)
  43. For Each strLine In arrLines
  44.   If Not(Left(UCase(LTrim(strLine)),Len(strCheckForString1)) = strCheckForString1) Then 
  45.      objTS.WriteLine strLine
  46.   End If
  47. Next
  48. set objFS=nothing
  49. Set objTS=nothing
  50. Set arrLines=nothing
  51. Set strCheckForString1=nothing
  52. Set objFS = CreateObject("Scripting.FileSystemObject" )
  53. Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
  54. strContents = objTS.ReadAll
  55. objTS.Close
  56. arrLines = Split(strContents, vbNewLine)
  57. Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)
  58. For Each strLine In arrLines
  59.   If Not(Left(UCase(LTrim(strLine)),Len(strCheckForString2)) = strCheckForString2) Then 
  60.      objTS.WriteLine strLine
  61.   End If
  62. Next
  63. set objFS=nothing
  64. Set objTS=nothing
  65. Set arrLines=nothing
  66. Set strCheckForString2=nothing
 

Le soucis est qu'à chaque nouvelle chaine que je veux supprimer, je dois créer une portion de code identique à celle qui est en bleue. Y'aurait-il moyen de faire un tableau de variables (1 variable = 1 chaine StrCheckForString) afin de faire une boucle for?

 

Si oui, comment? Dans certain cas, j'aurai 2 chaines StrCheckForString, dans d'autres j'aurai 5 chaines.. Ce n'est jamais fixe.


Message édité par slr56 le 13-01-2011 à 10:04:40
n°2048618
gzii
court-circuit
Posté le 13-01-2011 à 10:46:18  profilanswer
 

Alors tu met ton fic de départ dans une variable et tu fais ton bloc qui écrit dans une autre, et à la fin remet le nouveau contenu dans la première, et tourne sur un foreach de ton tableau de blocs à supprimer, ou un truc du genre.
Je ne vois pas ce qui te bloque, éventuellement reprend les bases comme je te l'ai déjà dit.
n fois le même bloc de code ça ne se fait pas.

Message cité 1 fois
Message édité par gzii le 13-01-2011 à 10:47:58
n°2048627
slr56
Tout problème a sa solution.
Posté le 13-01-2011 à 11:16:01  profilanswer
 

gzii a écrit :

Alors tu met ton fic de départ dans une variable et tu fais ton bloc qui écrit dans une autre, et à la fin remet le nouveau contenu dans la première, et tourne sur un foreach de ton tableau de blocs à supprimer, ou un truc du genre.
Je ne vois pas ce qui te bloque, éventuellement reprend les bases comme je te l'ai déjà dit.
n fois le même bloc de code ça ne se fait pas.


 
n fois le même bloc de code ça ne se fait pas. Je le sais et c'est bien pour ça que je demande. Mais comme je le dis, dès fois j'aurai 3 lignes, dès fois 4 dès fois plus. Donc je ne peux pas faire une boucle, si?

n°2048643
gzii
court-circuit
Posté le 13-01-2011 à 11:47:38  profilanswer
 

Si, reprend tout depuis le début, là à mon avis tu essaies de copier du code sans trop y comprendre.
Regarde le foreach par exemple sur une doc. Là tu l'utilises déjà.


Message édité par gzii le 13-01-2011 à 11:48:14

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBS] Supprimer un bloc de lignes

 

Sujets relatifs
[batch windows] Ecrire sur la même ligne ?Supprimer des mots dans une chaine de mots clés
supprimer une valeur d'un tableau (algorithme)Supprimer une ligne d'une table en php [résolu]
Regroupement de résultats sur une seul ligneControle nom fichier VBS
lire seconde ligne d'un fichier avec fgets en cRenvoi du numéro de ligne d'une cellule en VBA
fonction enregistrer ( appli bloc note ) 
Plus de sujets relatifs à : [VBS] Supprimer un bloc de lignes


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR