Modification d'un fichier texte

Modification d'un fichier texte - VB/VBA/VBS - Programmation

Marsh Posté le 11-08-2005 à 11:47:47    

Bonjour a toutes et tous,
 
Ca fait un petit bout de temps que je cherche une solution à mon problème mais n'etait pas très doué en prog. et n'ayant pas assez de temps pour m'y plonger réelement à fond je me permet de vous demander de l'aide.
 
La situation :
Je doit verifier rapidement le bon fonctionnement de mes routeurs (@work).
dans un premier temps, pour faire simple, j'ai crée un .bat qui fait des pings (ping -n 1 x.y.z.a) et qui ecrit ca dans un fichier resultat sur c:
Le resutlat est peu lisible, je me suis donc mis en tete de le modifier, tout d'abord en essayant avec la commande findstr des .bat traditionnel, mais c'est pas très pratique.
Je me suis dit que vbs me permetrait de le faire j'ai donc essayer plusieurs trucs et est resortit ceci :
 

Code :
  1. Dim FSO
  2. Set FSO = CreateObject("Scripting.FileSystemObject" )
  3. Set Fichier = FSO.OpenTextFile("c:\ping.txt" )
  4. Do While Not Fichier.AtEndOfStream
  5.       Var = Fichier.Readline
  6. C'est la que je coince, il faudrait que je teste le debut du texte et si celui ci est un des 4 cas qui ne m'interresse pas, je voudrait supprimer cette ligne. Les cas que je veut gérer sont :
  7.                     debut = Ping
  8.                  ou debut = Paquets
  9.                  ou debut = Dur
  10.                  ou debut = Minimum
  11. Loop
  12. Fichier.Close


Je me doute qu'il existe une methode qui efface une ligne mais je trouve pas ...
 
Sinon je pensait faire une copie des ligne qui m'interesse (avec Fichier.WriteLine) si le debut de la ligne ne correspond pas mais la encore c'est ce test qui me pose problème.
 
J'ai bien trouver quelque chose sur un site de codes sources (vbfrance) mais j'ai du mal a analyser le code et en plus il se plante.
Le voici (pour info)

Code :
  1. '********************
  2.     'Principe de la fonction :
  3.     'Si le paramètre DelLinesNumbers est vrai alors
  4.     ' on extrait dans Line les numéros des lignes à supprimer
  5.     ' et on les supprime
  6.     'sinon
  7.     ' si le param JustOneEvent est vrai alors
  8.     ' on cherche la première occurence de Line dans le fichier, on la supprime et on s'arrete
  9.     ' sinon
  10.     ' on cherche toutes les occurences de Line dans le fichier et on les supprime toutes
  11.     '
  12.     'Si testalltheline est vrai, il faut que la ligne du fichier lue soit exactement
  13.     'pareille à la line passée en paramètre, sinon une simple occurence suffit
  14.     '
  15.     'Si Ucase est vrai alors on met Line et la ligne lue en majuscule lors de la comparaison
  16.     '(ex. : PomPomPom =! pompompom mais POMPOMPOM = POMPOMPOM )
  17.     '
  18.     '
  19.     'Si NewFile est différent de "" alors on crée un nouveau fichier qui ne sera pas supprimé
  20.     'a la fin de la fonction, et on ne modifie pas l'original
  21.     '
  22.     'Si la fonction échoue, elle renvoie Faux
  23.     '
  24.     'Pour supprimer une ligne dans un fichier texte
  25.     'on copie toutes les autres lignes dans un fichier temporaire.
  26.     '*********************
  27.     '
  28.     '
  29.     'Le param Line doit contenir soit le texte de la ligne a supprimer, soit les numéros
  30.     'des ligens a supprimer séparés par ; ex. "3;7;15;150"
  31.     '
  32.  
  33.  
  34.     'On déclare la fonction.
  35.     Public Function DelLineInFile(ByVal FilePath As String,_
  36.                                   ByVal Line As String,_
  37.                                   ByVal DelLinesNumbers As Boolean,_
  38.                                   Optional ByVal JustOneEvent As Boolean = False,_
  39.                                   Optional ByVal TestAllTheLine As Boolean = False,_
  40.                                   Optional ByVal UCase As Boolean = False,_
  41.                                   Optional ByVal NewFile As String = vbNullString) As Boolean
  42.  
  43.         'On Error GoTo err
  44.  
  45.         Dim fSource As Integer 'Référence au fichier source
  46.         Dim fTarget As Integer 'Référence au fichier cible
  47.         Dim TempFile As String 'Variable qui contient le chemin du fichier temporaire
  48.         Dim LineToCopy As String 'La ligne à copier dans le fichier
  49.  
  50.         'On obtient de FreeFile une référence de fichier libre
  51.         'pour le fichier source
  52.         fSource = FreeFile()
  53.  
  54.         'On ouvre le fichier source en mode lecture et en acces partagé
  55.         FileOpen(fSource, FilePath, OpenMode.Input, OpenAccess.Read, OpenShare.Shared)
  56.  
  57.  
  58.         'On obtient de FreeFile une référence de fichier libre
  59.         'pour le fichier cible
  60.         fTarget = FreeFile()
  61.  
  62.         'si le fichier destination est defini alors on le prend, sinon
  63.         'on demande a windows de créer un fichier temporaire
  64.         TempFile = NewFile
  65.         If TempFile = vbNullString Then TempFile = IO.Path.GetTempFileName()
  66.  
  67.         'On ouvre le fichier cible en mode ecriture et en acces partagé
  68.         FileOpen(fTarget, TempFile, OpenMode.Output, OpenAccess.Write, OpenShare.Shared)
  69.  
  70.         'Si l'utilisateur souhaite que l'on supprime certaines lignes en fonction de
  71.         'leur numéro
  72.         If DelLinesNumbers Then
  73.  
  74.             'on déclare le tableau qui contiendra l'analyse de Line
  75.             'pour savoir qu'elles sont les lignes à supprimer
  76.             Dim Lines() As String
  77.  
  78.             'on déclare le tableau qui contiendra les ligne en elles mêmes
  79.             Dim LinesInt() As Integer
  80.             Dim i As Integer ' variable pour les boucles For
  81.             Dim CurrentLine ' variable pour savoir le nombre de lignes lues dans le fichier
  82.             Dim CurrentLineIndex As Integer 'l'index dans LinesInt() de la ligne à supprimer
  83.  
  84.             'la fonction slip separe les éléments de Line pour en extraire les lignes
  85.             'et les mettres dans un tableau
  86.             Lines = Line.Split(";" )
  87.  
  88.             'ensuite on met les lignes :
  89.             'on dimensionne le tableau d'entier
  90.             ReDim LinesInt(Lines.GetUpperBound(0))
  91.  
  92.             'On transforme le tableau de lignes sous forme de chaines
  93.             'en tabeau sous forme d'entiers
  94.             For i = Lines.GetLowerBound(0) To Lines.GetUpperBound(0)
  95.                 LinesInt(i) = Int(Lines(i))
  96.             Next i
  97.  
  98.             'On tri le tableau par ordre croissant
  99.             LinesInt.Sort(LinesInt)
  100.  
  101.             'la premiere ligne du tableau
  102.             CurrentLineIndex = LinesInt.GetLowerBound(0)
  103.  
  104.             'si un utilisateur s'est trompé dans l'appel de la fonction
  105.             'est a envoyé "5;4;f;7;u" f et u sont devenus 0 lors de la conversion,
  106.             'et la 0 eme ligne du fichier
  107.             'n'existe pas, donc on les ignore
  108.             'de plus puisque le tableau est trié tous les 0 sont au début
  109.             Do Until (LinesInt(CurrentLineIndex) > 0) Or (CurrentLineIndex = Lines.GetUpperBound(0))
  110.                 CurrentLineIndex = CurrentLineIndex + 1
  111.             Loop
  112.  
  113.             'Si aucune ligne > 0 n'a été trouvée, alors il n'ya aucune ligne a enlevé dans le fichier
  114.             If (CurrentLineIndex = Lines.GetUpperBound(0)) And (LinesInt(CurrentLineIndex) = 0) Then GoTo err
  115.  
  116.             Do
  117.                 'on laisse la main au systeme pour pas tout bloquer
  118.                 'on lit une ligne
  119.                 LineToCopy = LineInput(fSource)
  120.                 'on incrémente le nombre de lignes de lues
  121.                 CurrentLine = CurrentLine + 1
  122.                 '
  123.                 'si la ligne lue est une ligne a supprimé on ne la copie pas
  124.                 'et on passe a la ligne à supprimer suivante SI celle ci
  125.                 'n'est pas la derniere
  126.                 If CurrentLine = LinesInt(CurrentLineIndex) Then
  127.                     If Not CurrentLineIndex = LinesInt.GetUpperBound(0) Then CurrentLineIndex = CurrentLineIndex + 1
  128.                 Else
  129.                     'sinon on copie la ligne
  130.                     Print(fTarget, LineToCopy & vbCrLf)
  131.                 End If
  132.  
  133.                 'on continu jusqu'à ce qu'on arrive a la fin du fichier
  134.             Loop While Not EOF(fSource)
  135.  
  136.         Else 'sinon on supprime les lignes semblables a Line
  137.  
  138.             'SI lutilisateur l'a spécifié, on teste tout en majuscule
  139.             If UCase Then Line = Line.ToUpper
  140.  
  141.             Do
  142.                 LineToCopy = LineInput(fSource)
  143.                 'si l'utilisateur a spécifié que la même ligne lue
  144.                 'doit etre sensiblement exacte
  145.                 If TestAllTheLine Then
  146.                     'Dans le cas où l'utilisateut demande une comparaison sans
  147.                     'respecter la casse
  148.                     If UCase Then
  149.                         'si la ligne lue n'est pas semblable a Line
  150.                         'on la copie
  151.                         If Not LineToCopy.ToUpper = Line Then rint(fTarget, LineToCopy & vbCrLf)
  152.                         'Si on respecte la casse
  153.                     Else
  154.                         If Not LineToCopy = Line Then _
  155.                         Print(fTarget, LineToCopy & vbCrLf)
  156.                     End If
  157.                 Else
  158.                     If UCase Then
  159.                         'si aucune occurence de Line n'est trouvée dans la ligne lue alors
  160.                         'on copie la ligne
  161.                         If InStr(LineToCopy.ToUpper, Line) = 0 Then Print(fTarget, LineToCopy & vbCrLf)
  162.                     Else
  163.                         If InStr(LineToCopy, Line) = 0 Then Print(fTarget, LineToCopy & vbCrLf)
  164.                     End If
  165.                 End If
  166.             Loop While Not EOF(fSource)
  167.  
  168.         End If
  169.  
  170.         'on ferme l'acces aux fichiers
  171.         FileClose(fSource, fTarget)
  172.  
  173.         's'il l'utilisateur n'a pas spécifié de nom de fichier cible alors
  174.         'on supprime l'ancien fichier et on copie le fichier temporaire a sa place
  175.         If NewFile = vbNullString Then
  176.             'on supprime l'ancien fichier
  177.             Kill(FilePath)
  178.             'on copie le fichier temporaire a sa place
  179.             FileCopy(TempFile, FilePath)
  180.         End If
  181.         'sinon on conserve l'ancien fichier
  182.  
  183.         DelLineInFile = True 'la fonction a réussi
  184.         Exit Function
  185. err:
  186.  
  187.         DelLineInFile = False 'la fonction a échouée
  188.  
  189.     End Function


Ce que je comprend pas c'est comment on lui dit de traiter le fichier en question et le ligne a virer ...
 
Enfin bref j suis un peu tout perdu et j'aurrai bien besoin d'aide.
Merci d'avance.
 
PS : j'espère que c'est pas trop décousu ! :)


---------------
Qui cherche trouve et qui donne reçoit ...
Reply

Marsh Posté le 11-08-2005 à 11:47:47   

Reply

Marsh Posté le 11-08-2005 à 11:58:03    

La méthode la plus facile pour faire ce que tu veux est de copier les lignes qui t'intressent dans un autre fichier et de le renommer par la suite. ça sera beaucoup plus simple que de lire et d'écrire dans le même fichier ;) .


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 11-08-2005 à 14:07:58    

Je me doutait un peu de ca, mais pour le test des valeurs du debut de la ligne, comment je fait ?
Parce qu'en plus, histoire de compliquer un peu y a des espaces au debut de la ligne ...


---------------
Qui cherche trouve et qui donne reçoit ...
Reply

Marsh Posté le 11-08-2005 à 14:56:20    

Utilise  la fonction InStr qui te permet de savoir si un chaine est présente à l'intérieur d'une autre chaine. cf:
http://msdn.microsoft.com/library/ [...] tinstr.asp
 
D'autres fonctions peuvent t'intéresser:
-Trim qui te permet de virer les espace en début et en fin de chaine
http://msdn.microsoft.com/library/ [...] tltrim.asp
-Mid qui te permet de prendre juste le bout de chaine de caractère qui t'intéresse:
http://msdn.microsoft.com/library/ [...] fctmid.asp


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 12-08-2005 à 11:29:39    

Super, merci bien je regarde ca de plus près.
 
A++


---------------
Qui cherche trouve et qui donne reçoit ...
Reply

Marsh Posté le 12-08-2005 à 12:07:57    

Bon voila, j'ai pu faire ce que je voulait de mon fichier texte je vous donne mon source ultra simple si quelqu'un a besoin de quelque chose de similaire ...
 

Code :
  1. Dim FSO, Fichier, cible, Ligne
  2. Set FSO = CreateObject("Scripting.FileSystemObject" )
  3. Set Fichier = FSO.OpenTextFile("c:\ping.txt" ) 'fichier à analyser
  4. Set cible = FSO.CreateTextFile("c:\resultat.txt",true) 'fichier resultat
  5. Do While Not Fichier.AtEndOfStream
  6.       Ligne = Fichier.Readline
  7.       if Instr (Ligne, "Statistiques" ) = 0 then 'test de la presence de la chaine
  8.  if Instr (Ligne, "Paquets" ) = 0 then
  9.   if Instr (Ligne, "Dur" ) = 0 then
  10.          if Instr (Ligne, "Minimum" ) = 0 then
  11.     cible.writeline Ligne 'si elle n'y est pas on ecrit
  12.    end if
  13.   end if
  14.  end if
  15.       end if
  16. Loop
  17. Fichier.Close
  18. cible.close


 
Merci encore du coup de patte :)
A++


Message édité par yannock le 12-08-2005 à 12:08:29

---------------
Qui cherche trouve et qui donne reçoit ...
Reply

Marsh Posté le 12-08-2005 à 15:17:42    

Tu sais, tu peux faire ça aussi, ça sera plus compact ;)

Code :
  1. if Instr (Ligne, "Statistiques" ) = 0 then And Instr (Ligne, "Paquets" ) = 0 And Instr (Ligne, "Dur" ) = 0 And Instr (Ligne, "Minimum" ) = 0 then
  2.           cible.writeline Ligne 'si elle n'y est pas on ecrit
  3.       end if


Message édité par mareek le 12-08-2005 à 15:17:57

---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed