Cette fonction permet de supprimer une ligne dans un fichier texte, en fonction du numéro de la ligne ou du texte de la ligne.
La fonction permet de supprimer plusieurs lignes si on en spécifie plusieurs dans le cas où l'on précise les numéros des lignes ou alors au choix de supprimer soit toutes les occurences de la ligne soit lla premiere occurence seulement.
On peut choisir d'avoir exactement la ligne ou de supprimer les lignes qui contiennent tel texte.
On peut aussi choisir de respecter la casse ou pas.
Enfin on peut choisir de ne pas supprimer le fichier mais d'en créer un autre.
Voilà, j'espere avoir couvert les cas les plus courants.
Source / Exemple :
'********************
'Principe de la fonction :
'Si le paramètre DelLinesNumbers est vrai alors
' on extrait dans Line les numéros des lignes à supprimer
' et on les supprime
'sinon
' si le param JustOneEvent est vrai alors
' on cherche la première occurence de Line dans le fichier, on la supprime et on s'arrete
' sinon
' on cherche toutes les occurences de Line dans le fichier et on les supprime toutes
'
'Si testalltheline est vrai, il faut que la ligne du fichier lue soit exactement
'pareille à la line passée en paramètre, sinon une simple occurence suffit
'
'Si Ucase est vrai alors on met Line et la ligne lue en majuscule lors de la comparaison
'(ex. : PomPomPom =! pompompom mais POMPOMPOM = POMPOMPOM )
'
'
'Si NewFile est différent de "" alors on crée un nouveau fichier qui ne sera pas supprimé
'a la fin de la fonction, et on ne modifie pas l'original
'
'Si la fonction échoue, elle renvoie Faux
'
'Pour supprimer une ligne dans un fichier texte
'on copie toutes les autres lignes dans un fichier temporaire.
'*********************
'
'
'Le param Line doit contenir soit le texte de la ligne a supprimer, soit les numéros
'des ligens a supprimer séparés par ; ex. "3;7;15;150"
'
'On déclare la fonction.
Public Function DelLineInFile(ByVal FilePath As String, _
ByVal Line As String, _
ByVal DelLinesNumbers As Boolean, _
Optional ByVal JustOneEvent As Boolean = False, _
Optional ByVal TestAllTheLine As Boolean = False, _
Optional ByVal UCase As Boolean = False, _
Optional ByVal NewFile As String = vbNullString) _
As Boolean
'On Error GoTo err
Dim fSource As Integer 'Référence au fichier source
Dim fTarget As Integer 'Référence au fichier cible
Dim TempFile As String 'Variable qui contient le chemin du fichier temporaire
Dim LineToCopy As String 'La ligne à copier dans le fichier
'On obtient de FreeFile une référence de fichier libre
'pour le fichier source
fSource = FreeFile()
'On ouvre le fichier source en mode lecture et en acces partagé
FileOpen(fSource, FilePath, OpenMode.Input, OpenAccess.Read, OpenShare.Shared)
'On obtient de FreeFile une référence de fichier libre
'pour le fichier cible
fTarget = FreeFile()
'si le fichier destination est defini alors on le prend, sinon
'on demande a windows de créer un fichier temporaire
TempFile = NewFile
If TempFile = vbNullString Then TempFile = IO.Path.GetTempFileName()
'On ouvre le fichier cible en mode ecriture et en acces partagé
FileOpen(fTarget, TempFile, OpenMode.Output, OpenAccess.Write, OpenShare.Shared)
'Si l'utilisateur souhaite que l'on supprime certaines lignes en fonction de
'leur numéro
If DelLinesNumbers Then
'on déclare le tableau qui contiendra l'analyse de Line
'pour savoir qu'elles sont les lignes à supprimer
Dim Lines() As String
'on déclare le tableau qui contiendra les ligne en elles mêmes
Dim LinesInt() As Integer
Dim i As Integer ' variable pour les boucles For
Dim CurrentLine ' variable pour savoir le nombre de lignes lues dans le fichier
Dim CurrentLineIndex As Integer 'l'index dans LinesInt() de la ligne à supprimer
'la fonction slip separe les éléments de Line pour en extraire les lignes
'et les mettres dans un tableau
Lines = Line.Split(";")
'ensuite on met les lignes :
'on dimensionne le tableau d'entier
ReDim LinesInt(Lines.GetUpperBound(0))
'On transforme le tableau de lignes sous forme de chaines
'en tabeau sous forme d'entiers
For i = Lines.GetLowerBound(0) To Lines.GetUpperBound(0)
LinesInt(i) = Int(Lines(i))
Next i
'On tri le tableau par ordre croissant
LinesInt.Sort(LinesInt)
'la premiere ligne du tableau
CurrentLineIndex = LinesInt.GetLowerBound(0)
'si un utilisateur s'est trompé dans l'appel de la fonction
'est a envoyé "5;4;f;7;u" f et u sont devenus 0 lors de la conversion,
'et la 0 eme ligne du fichier
'n'existe pas, donc on les ignore
'de plus puisque le tableau est trié tous les 0 sont au début
Do Until (LinesInt(CurrentLineIndex) > 0) Or (CurrentLineIndex = Lines.GetUpperBound(0))
CurrentLineIndex = CurrentLineIndex + 1
Loop
'Si aucune ligne > 0 n'a été trouvée, alors il n'ya aucune ligne a enlevé dans le fichier
If (CurrentLineIndex = Lines.GetUpperBound(0)) And (LinesInt(CurrentLineIndex) = 0) Then GoTo err
Do
'on laisse la main au systeme pour pas tout bloquer
'on lit une ligne
LineToCopy = LineInput(fSource)
'on incrémente le nombre de lignes de lues
CurrentLine = CurrentLine + 1
'
'si la ligne lue est une ligne a supprimé on ne la copie pas
'et on passe a la ligne à supprimer suivante SI celle ci
'n'est pas la derniere
If CurrentLine = LinesInt(CurrentLineIndex) Then
If Not CurrentLineIndex = LinesInt.GetUpperBound(0) Then _
CurrentLineIndex = CurrentLineIndex + 1
Else
'sinon on copie la ligne
Print(fTarget, LineToCopy & vbCrLf)
End If
'on continu jusqu'à ce qu'on arrive a la fin du fichier
Loop While Not EOF(fSource)
Else 'sinon on supprime les lignes semblables a Line
'SI lutilisateur l'a spécifié, on teste tout en majuscule
If UCase Then Line = Line.ToUpper
Do
LineToCopy = LineInput(fSource)
'si l'utilisateur a spécifié que la même ligne lue
'doit etre sensiblement exacte
If TestAllTheLine Then
'Dans le cas où l'utilisateut demande une comparaison sans
'respecter la casse
If UCase Then
'si la ligne lue n'est pas semblable a Line
'on la copie
If Not LineToCopy.ToUpper = Line Then _
Print(fTarget, LineToCopy & vbCrLf)
'Si on respecte la casse
Else
If Not LineToCopy = Line Then _
Print(fTarget, LineToCopy & vbCrLf)
End If
Else
If UCase Then
'si aucune occurence de Line n'est trouvée dans la ligne lue alors
'on copie la ligne
If InStr(LineToCopy.ToUpper, Line) = 0 Then _
Print(fTarget, LineToCopy & vbCrLf)
Else
If InStr(LineToCopy, Line) = 0 Then _
Print(fTarget, LineToCopy & vbCrLf)
End If
End If
Loop While Not EOF(fSource)
End If
'on ferme l'acces aux fichiers
FileClose(fSource, fTarget)
's'il l'utilisateur n'a pas spécifié de nom de fichier cible alors
'on supprime l'ancien fichier et on copie le fichier temporaire a sa place
If NewFile = vbNullString Then
'on supprime l'ancien fichier
Kill(FilePath)
'on copie le fichier temporaire a sa place
FileCopy(TempFile, FilePath)
End If
'sinon on conserve l'ancien fichier
DelLineInFile = True 'la fonction a réussi
Exit Function
err:
DelLineInFile = False 'la fonction a échouée
End Function
Conclusion :
Je n'ai pas eu le temps de bien la tester, faites moi part de vos observations et des bugs que vous rencontrez.
Cette source a un but d'apprentissage des accès fichier texte en .net
A la moindre hésitation ou incompréhension sur ce code n'hésitez à me contacter en laissant un commentaire ou un message ou sur #programmation
Voila Bonne Prog a tous.
PS : Notez la version vb6 publiée par Jack :
http://www.vbfrance.com/code.aspx?ID=22826
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.