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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 228 fois - Téléchargée 29 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

PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25 -
salut,
je connais pas .Net, mais "Private collection As New ArrayList"
Collection n'est pas un Mot Réservé??

et pour une question pratique (pour toi et d'éventuels utilisateurs), çà ne serait pas mieux de faire un module ou une classe avec tout de genre de manips, plutôt que de poster plusieurs extraits?

(pas noté, évidemment..)
++
PCPT [AFCK]
Atalante1108
Messages postés
4
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
1 novembre 2005
-
Salut :)
Non, je viens juste de verifier mais collection n'est pas un mot reserve en VB.NET.
Ensuite, oue, je crois que tu as raison, j'aurai pu faire un p'tit prog ou qqchose comme ca qui illustrerait mieux, pas trop le temps pour l'instant mais je pense que je rajouterai 12c4 un zip, ca pourrait etre mieux oue! Merci du conseil.
Enfin, mon explication c t surtt pr la theorie, une fois que tu as compris je pense que c'est facile de reutiliser ca en fonction des tes besoins.
Mais promis, des que j'aurai plus de temps je ferai un petit prog ki sera peut etre plus clair ;)
++
(tinkietes, mon but n'est pas d'avoir une note mais plutot de proposer une methode differente pour le probleme de "supprimer une ligne dans un fichier" ;) en esperant ke ca puisse rendre service a d'autres)
Afyn
Messages postés
613
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016
-
Bonne approche ... bravo

Un driver ODBC ? celui de ms ne supporte pas les delete

Bonne prog

Afyn
Navedac
acrcorp
Messages postés
96
Date d'inscription
dimanche 16 février 2003
Statut
Membre
Dernière intervention
23 septembre 2007
-
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 :)
Atalante1108
Messages postés
4
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
1 novembre 2005
-
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.

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.