Supprimer la ligne numero n d'un fichier texte .txt

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 037 fois - Téléchargée 27 fois

Contenu du snippet

Ce code supprime la ligne désirée d'un fichier texte.

Le principe
>Création d'un fichier texte temporaire vide dans le même répertoire que le fichier cible
>Ouverture du fichier cible
>Ouverture du fichier temporaire de destination
>Lecture ligne par ligne du fichier source
>écriture de toutes les lignes lues sauf celle précisée dans le fichier de destination
>fermeture des fichiers
>Supression du fichier cible
>renommage du fichier de destination avec le nom du fichier cible

J'utilise 2 fonctions complémentaires
> La première propose un chemin complet ("aborescence de répertoire + nomfichier") pour le fichier .txt temporaire à partir du chemin complet du fichier .txt cible
> La seconde compte le nombre de ligne du fichier cible, ce qui permet à l'utilisateur de supprimer "réellement" une ligne

Source / Exemple :


Function Chemin_nouveau_fichier(Chemin_complet As String)
Dim TEMP As String
Dim NbOC As Integer
Dim compteur as integer

'compte le nombre de caractère dans une chaîne
NbOC = (Len(Chemin_complet) - Len(Replace(Chemin_complet, "\", "", , , 1))) / Len("\")
TEMP = Chemin_complet
For compteur = 1 To NbOC
TEMP = Mid(TEMP, InStr(1, TEMP, "\") + 1)
Next
Chemin_nouveau_fichier = Left(Chemin_complet, Len(Chemin_complet) - Len(TEMP) - 1) & "\TEMP_" & TEMP
End Function

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Function compte_ligne(Chemin_complet As String)
On Error GoTo ANNULER 'pour traiter(sommairement)
'les erreurs
Open Chemin_complet For Input As #1
While Not EOF(1)
Line Input #1, texte
NbLignes = NbLignes + 1
Wend
Close #1
compte_ligne = NbLignes
ANNULER:
End Function

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Sub suppr_ligne_TXT()

Dim text As String
Dim tmp As String
Dim N°ligne As Variant
Dim nbre_ligne_fichier As Integer

Dim CHEMIN_COMPLET_TXT As String
Dim CHEMIN_COMPLET_NOUVEAU_TXT As String

CHEMIN_COMPLET_TXT = "C:\Documents and Settings\test.txt"
CHEMIN_COMPLET_NOUVEAU_TXT = Chemin_nouveau_fichier(CHEMIN_COMPLET_TXT)

'INPUTBOX "INTELLIGENTE" QUI DONNE LE NOMBRE DE LIGNE
nbre_ligne_fichier = compte_ligne(CHEMIN_COMPLET_TXT)
N°ligne = 0
While N°ligne > nbre_ligne_fichier Or N°ligne < 1
N°ligne = InputBox("Numéro de la ligne à supprimer?" & Chr(10) & "Entre 1 et " & nbre_ligne_fichier & "", "SAISIE")
If N°ligne = "" Then Exit Sub
N°ligne = CInt(N°ligne)
Wend

'N°ligne = VARIABLE_X

'CREATION FICHIER TEMPORAIRE
Set FSys = CreateObject("Scripting.FileSystemObject")
Set MonFic = FSys.CreateTextFile(CHEMIN_COMPLET_NOUVEAU_TXT)

'FERMETURE FICHIER TEMPORAIRE
MonFic.Close

'ouverture des 2 fichiers texte
Open CHEMIN_COMPLET_TXT For Input As 1#
Open CHEMIN_COMPLET_NOUVEAU_TXT For Output As 2#

'LECTURE "CONDITIONNELLE" DU FICHIER SOURCE ET ECRITURE DANS LE NOUVEAU FICHIER
compteur = 0
While Not (EOF(1) Or False)
compteur = compteur + 1
Input #1, text
If compteur = N°ligne Then Else Print #2, text   '> print est utilisé pour éviter les guillemets apparaissant avec .write
Wend

'fermeture des 2 fichiers texte
Close #1
Close #2

'Supprmime le fichier SOURCE
Kill CHEMIN_COMPLET_TXT
'Renomme le fichier TEMP(et donc remplace le fichier SOURCE)
Name CHEMIN_COMPLET_NOUVEAU_TXT As CHEMIN_COMPLET_TXT

'If N°ligne > nbre_ligne_fichier Or N°ligne < 1 Then MsgBox "Procédure exécutée avec succès, mais sans effet!", vbInformation, "Message"

End Sub

Conclusion :


Merci à cqui789 et yocrita pour leur fonction qui compte le nombre de caractères dans une chaîne.

A voir également

Ajouter un commentaire

Commentaires

cs_jadot
Messages postés
21
Date d'inscription
mardi 31 août 2004
Statut
Membre
Dernière intervention
10 septembre 2007
-
Oui je ne dis pas le contraire, je ne parlais pas de ton code en particulier Mortalino.
C'etait juste une reflexion "generale" car parfois c'est tellement la "competition" du nombre de ligne que ca en devient illisible.
Je rejoins simplement l'idée d'Econs : "il pouvait même faire moins, mais çà aurait été moins lisible."
mortalino
Messages postés
6789
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16 -
Salut Jadot,

dans ce cas précis, mon code est plus court et plus performant !

"si on supprime les commentaires ca fait moins de lignes mais ce n'est pas pour ca que c'est meilleur (que du contraire) ;-) "
Hors commentaires, j'ai qd même réduit son code de 50% !

++
cs_jadot
Messages postés
21
Date d'inscription
mardi 31 août 2004
Statut
Membre
Dernière intervention
10 septembre 2007
-
Salut,

Pourquoi utiliser un fichier temporaire ?
On peut garder le tout en memoire dans un buffer et réécrire dans le fichier d'origine !

PS : A tout ceux qui comptent le nombre de lignes. Ce n'est pas le nombre de lignes qui fait la qualité d'un code, si on supprime les commentaires ca fait moins de lignes mais ce n'est pas pour ca que c'est meilleur (que du contraire) ;-)
MrJava_Javaman
Messages postés
5
Date d'inscription
jeudi 2 février 2006
Statut
Membre
Dernière intervention
1 septembre 2007
-
Oublier de dire que si tu change "gtLignCount" tu dois avec, changer "i" dans la fonction principal surtout si c'est au plus grand ...
MrJava_Javaman
Messages postés
5
Date d'inscription
jeudi 2 février 2006
Statut
Membre
Dernière intervention
1 septembre 2007
-
*** c'est la premiere commentaire pour maoi dans ce site :)
Alors j'utilise une fonction dans un "DLL" depuis longtemps je crois q'elle est tres utile .. elle a une maniere differente d'effacer une ligne mais elle peux etre redefiner d'une autre maniere ;
Ce que tu dois faire est d'ecrire ce ligne dans ton programme :

# a.dlLigne FILE_PATH, data_I_want_to_del,, len(data_I_want_to_del)

ensuite le "DLL" (ou le module comme tu veux) contient ces petites lignes :

01# Private Function gtLignCount(ByVal path as String) As Integer
02# Dim tmp As String
03# Open path For Input as #1
04# Do Until Eof(1)
05# Line Input #1, tmp
06# gtLignCount = gtLignCount + 1
07# Loop
08# Close #1
09# End Function

10# Function dlLigne(ByVal path As String, _
ByVal data As String, _
Optional SelStart As Byte = 1, _
Optional SelLen As Byte)
11# Dim txtArr() As String, i as Integer
12# ReDim txtArr(gtLignCount(path)) As String
13# Open path for Output As #1
14# For i = 0 To UBound(txtArr)
15# If Mid(txtArr(i), SelStart, SelLen) data Then i i + 1
16# Print #1, txtArr(i)
17# Next i
18# Close #1
19# End Function
20# 'By MrJava (Amahdy).

Remarques:
-"SelStart" et "SelLen" sont utilise pour savoir ou ce trouve le "data" donne ..
par exemple si le ligne contien un date puis un nom et je veux efface ce ligne quand je ne sais pas le date ;
du maniere si le ligne est comme ca :
21/10/2005_02:10:07 username=MrJava password=123
et bien sure je ne sais pas le password ou le date exactement mais je veux suprimer le user MrJava alors la fonction soit utilise comme ca :

# a.dlLigne FILE_PATH, "MrJava", 30, 6

-"SelStart" et "SelLen" sont en type "Byte" car un ligne peux pas contenir plus que 255 caractere tandis que "gtLignCount" est du type "Integer" ou si c'est plus large tu peux utilise "Long" .

***Excuser moi si j'ai fautes d'orthographe , je suis egyptien et pas d'une pays francaise ..

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.