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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 194 fois - Téléchargée 31 fois

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

Ajouter un commentaire Commentaires
cs_flash007 Messages postés 11 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 21 septembre 2006
21 sept. 2006 à 09:25
Super code, dommage que j'ai une erreur "Overload resolution failed because no accessible 'Split' can be called without a narrowing conversion:(BC30519)" au niveau du Split :(
Impossible d'aller plus loin..
Utilisateur anonyme
26 févr. 2006 à 18:43
Je trouve ce code très bien mais dans l'ètat actuel il risque de remplacer des caractères spèciaux, pour ce faire j'y ajouterai une surcharge du genre :
en ecriture
Dim fichier As StreamWriter = New StreamWriter(Application.StartupPath & "\nomFichier.txt", False, System.Text.Encoding.Default)
et en lecture
Dim fichier As StreamReader = New StreamReader(Application.StartupPath & "\nomFichier.txt", System.Text.Encoding.Default)
Idem 7/10
Bonne prog
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
20 févr. 2006 à 12:43
C'est plus simple si tu créer la procédure de lecture et écriture à part que tu supprime la ligne dans le TextBox et que tu enregistre le fichier après, non ?! 7/10.

Bonne continuation !

Redman
Atalante1108 Messages postés 4 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 1 novembre 2005
1 nov. 2005 à 18:27
Merci pour vos commentaires :)
Effectivement Acrcorp, tu as entierement raison, si le fichier contient un nombre tres important de donnees, ca risque de poser probleme ;)
Je vais le rajouter dans la description.
acrcorp Messages postés 96 Date d'inscription dimanche 16 février 2003 Statut Membre Dernière intervention 23 septembre 2007
30 oct. 2005 à 10:11
Le principal problème ave ce genre méthode est le fait qu'on charge tout le fichier en mémoire. Si celui ci est énorme, il y a un blème...
Mais sinon, c'est classique de faire comme ça, c'est plus facile pour plein de raison :)

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.