Supprimer une ligne d?un fichier texte en utilisant une collection (arraylist)

Contenu du snippet

Rebonjour
Voici ma 2ème soluce répondant à la question :
« Comment supprimer une ligne d?un fichier texte ? »

Pour cela, il y a plusieurs solutions, et la plus courante proposée est de passer par l?intermédiaire d?un fichier temporaire.

Il faut savoir qu?à ma connaissance, il n?existe pas de méthode existante pour automatiquement supprimer une ligne d?un fichier, et c?est bien dommage mais bon...

Je vous propose ici une autre solution qui pourra peut-être vous intéresser.

L?idée est la suivante :
1)On lit le fichier et on ajoute chaque ligne dans une collection (arraylist)
2)On supprime l?objet de la collection (= ligne) que l?on veut enlever
3)On réécrit le fichier avec la nouvelle collection (c?est-à-dire, moins la ligne que l?on a décidé d?enlever)

Cette solution permet d?éviter d?utiliser un autre fichier temporaire, et permet donc de travailler sur un seul et même fichier.

NOTE:
Si vous travaillez avec un "gros" fichier contenant un nombre important de donnees, cette solution ne sera pas tout a fait adaptee car tout le fichier devra etre charge en memoire dans la collection, lu, reecrit etc => sans doute probleme de lenteur et utilisation importante de memoire.

Source / Exemple :


'1ère partie :
'Au début du programme, vous devez lire le fichier et copier les lignes dans une collection. 

'Le variable collection doit être déclarée globale pour pouvoir être utilisée dans plusieurs procédures

Private collection As New ArrayList

'Puis il vous faut créer la procédure qui va lire le fichier. Ceci peut être fait durant le chargement de la « form »

Private Sub frmEx_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
           
Try
'crée une instance du fichier que l?on veut lire. (Application.StartupPath renvoie le chemin de votre application. Le fichier doit donc se trouver a cet endroit. Remplacez nomFichier par le nom de votre fichier texte.)
Dim fichier As StreamReader = New StreamReader(Application.StartupPath & "\nomFichier.txt")

'déclare une variable contenant une ligne du fichier 
Dim ligne As String

'Parcoure le fichier jusqu?à ce qu?il n?y ait plus de caractères
Do Until fichier.Peek = -1
	'lit la ligne du fichier
ligne = fichier.ReadLine  
'ajoute la ligne dans la collection   
collection.Add(ligne)
Loop
'ferme le fichier
fichier.Close()
Catch ex As Exception
'affiche le message d?erreur
MsgBox(ex.Message)
End Try

End Sub

'Enfin, vous devez créer la procédure qui permettra de supprimer une ligne

Private Sub supprimeLigne()
	Dim indexLigne As Integer
	'cette variable doit contenir l?index de la ligne que vous voulez supprimer. Pour cela, il y a plusieurs façons de faire, tout dépend de votre cas, mais par exemple, vous pouvez utiliser une liste déroulante combobox ou une listbox, la remplir avec les lignes du fichier, et choisir la ligne que vous voulez supprimer en cliquant sur la ligne correspondante dans la liste déroulante. Dans cette exemple, l?index de la ligne serait donc :
indexLigne = combobox.SelectedIndex
'supprime la ligne sélectionnée de la collection
collection.RemoveAt(indexLigne)

Try
'déclare le fichier pour ecrire; ?false? signifie que le fichier va etre ecrit par dessus; si cela avait ete ?true? les données auraient été ajoutées à la fin du fichier
Dim fichier As StreamWriter = New StreamWriter(Application.StartupPath & "\nomFichier.txt", False)
            Dim i As Integer
		'pour chaque ligne de la collection
            For i = 0 To collection.Count ? 1
			'ecrit la ligne dans le fichier
                fichier.WriteLine(collection(i))
            Next
            'Ferme le fichier
            fichier.Close()
Catch ex As Exception
            'Code exécuté en cas d'exception
            MsgBox(ex.Message)
        End Try

    End Sub

'Et voilà, enjoy ! ;)

'PS : le code pour afficher les lignes d?un fichier dans une liste déroulante pourrait simplement être par exemple
Dim i As Integer
?Pour chaque ligne de la collection
For i = 0 To collection.Count - 1
Dim ligneCol As String = collection(i)
?ajoute la ligne de la collection dans la liste déroulante
      NomCombobox.Add(ligneCol)
Next

'Il est également possible, si votre ligne contient plusieurs champs séparés par un délimiteur tel que un espace, un caractère particulier comme « | », « ; », une tabulation etc de ne choisir d?afficher dans la liste déroulante qu?un seul champ de la ligne ; par exemple
'declare un tableau de chaines de caracteres qui contiendra les champs d?une ligne
Dim i As Integer
'Pour chaque ligne de la collection
For i = 0 To collection.Count - 1
Dim ligneCol As String = collection(i)
Dim champs() As String
'découpe le tableau en fonction du délimiteur et du nombre de champs attendu, exemple avec le caractère tabulation comme délimiteur et 5 comme le nombre de champs que contient la ligne
champs = ligneCol.Split(vbTab, 5)
'ajoute juste le 1er champ au lieu de toute la ligne
NomCombobox.Add(champs(0))
Next

Conclusion :


Voilà, si vous avez besoin de plus de précision, ou pour n?importe quelle raison n?hésitez pas à me contacter!

En espérant avoir pu vous donner une nouvelle solution pour effacer une ligne dans un fichier, je vous souhaite bonne prog !

A voir également

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.