Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SUPPRIMER LA LIGNE NUMERO N D'UN FICHIER TEXTE .TXT


Information sur la source

Catégorie :Fichier / Disque Classé sous : supprimer, ligne, texte, 1, une Niveau : Débutant Date de création : 21/08/2006 Vu : 8 249

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

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

  • 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
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.
 

Commentaires et avis

signaler à un administrateur
Commentaire de Alain Proviste le 21/08/2006 19:20:31 administrateur CS

n'essaie pas de me faire croire que ça n'était pas déjà sur le site :|

sinon utilisez les fonctions de windows pour créer un fichier temporaire plutot que de le placer sur c: serait bienvenue.

signaler à un administrateur
Commentaire de jean_marc_n2 le 21/08/2006 20:01:49

Hello,
quelques conseils pour l'avenir:
- Il est d'usage d'indenter son code, c'est à dire de faire apparaître la structure logique de celui-ci par une utilisation judicieuse des tabulations. Exemple:
For i = 1 to 10
    If condition Then
        ' je suis la
    End If
Next i

- Il est incorrect d'ouvrir un fichier avec explicitement #1, #2, etc. On utilise à la place la fonction Freefile() qui renvoie le prochain numéro libre:
Dim f as Integer
    f = Freefile
    Open "truc.txt" for input as #f
        Line Input #f, szBuffer
    Close #f
- C'est bien d'avoir mis un mini traitement d'erreur dans compte_ligne, mais ça aurait été encore mieux de généraliser à toutes les fonctions
- Quitte à mettre un traitement d'erreur, autant le faire bien et renvoyer des infos utiles pour l'appelant, telles que: Numéro de l'erreur, Description de l'erreur. Libre ensuite à l'appelant d'en faire ce qu'il veut.
- L'utilisation de:
Set FSys = CreateObject("Scripting.FileSystemObject")
Set MonFic = FSys.CreateTextFile(CHEMIN_COMPLET_NOUVEAU_TXT)
est inutile (lent, une référence inutile, peu portable, j'en passe)! Il suffit de faire:
Dim f as Integer
    f = Freefile
    Open CHEMIN_COMPLET_NOUVEAU_TXT For Output As #f
    Close #f
- La Sub suppr_ligne_TXT() serait à mon avis bien mieux en fonction, retournant des infos sur le bon (ou mauvais) déroulement des opérations.

Cordialement,
Jean-marc

signaler à un administrateur
Commentaire de Alain Proviste le 21/08/2006 20:14:51 administrateur CS

ouch effectivement je n'avais pas vu les appels à fso ...

signaler à un administrateur
Commentaire de econs le 21/08/2006 21:30:16 administrateur CS

Bon, alors il reste deux ou trois choses non mentionnées ci-dessus :


Au moins deux soucis dans la ligne qui suit : Le ° dans le nom de variable et le type Variant (beurk)
Dim N°ligne As Variant
Surtout, quel intérêt de la déclarer Variant si c'est pour la caster juste derrière en Int ?
N°ligne = CInt(N°ligne)


C'est quoi l'intérêt de cette boucle ? Tu affectes, et écrases à chaque tour la variable TEMP ... Le For et le Next peuvent être supprimés, puisque compteur n'est pas utilisé.
# For compteur = 1 To NbOC
# TEMP = Mid(TEMP, InStr(1, TEMP, "\") + 1)
# Next

Ouvrir un fichier temporaire pour le fermer juste derrière ne présente aucun intérêt, puisque tu écris dans ce même fichier quelques lignes en dessous.

La condition
(Not (EOF(1) Or False))
peut se résumer ainsi : (Not (EOF(1)) ... Le False ne sert à rien. (x Or False = x)

C'est rigolo les Then vides ...
If compteur = N°ligne Then Else Print #2, text
Pourquoi ne pas jouer avec la négation de la condition dans ce cas ?
If compteur <> N°ligne Then Print #2, text


Je crois qu'on peut arrêter là d'accabler ce code. Il est très perfectible.
Et déjà présent dans les snippets de codyx.org, en beaucoup moins de lignes :
http://www.codyx.org/snippet_supprimer-ou-plusieurs-lignes-dans-fichier_76.aspx

signaler à un administrateur
Commentaire de mortalino le 21/08/2006 23:10:38

Salut,

1/ avec une collection, en 20 ou 30 lignes c'est faisable !!

2/ Ton code n'est pas dynamique, cela oblige l'utilisateur à connaitre la ligne à supprimer.
   Il faut créer une Form, avec un contrôle reprenant chaque ligne du fichier texte,
   l'utilisateur clique sur la ligne à supprimer.

++

signaler à un administrateur
Commentaire de mortalino le 21/08/2006 23:14:56

Arf, salut Manu, ;)

j'avais pas vu ton lien, c'est bien ce qui me semblait, avec une collection, c'est plus
court. Willy s'est gavé, 20 ou 30 lignes, j'étais loin du compte...
++

signaler à un administrateur
Commentaire de mortalino le 22/08/2006 02:05:05

Re, je t'ai fait un exemple (40 lignes, possibilité d'offrir le choix du fichier à l'utilisateur
et il choisi la ligne à supprimer dans un ListBox :

Ce qu'il faut :

* une Form
* un listbox nommé List1
* un Commandbutton nommé cbtValider
* le composant 'Microsoft Common Dialog 6.0' (dans 'ajouter composants...', tu le nommes dlgNomFichier

' *** dans les déclarations :
Dim sFichier As String, ff As Integer

Private Sub cbtValider_Click()
    Dim i As Integer
If List1.ListIndex = -1 Then Exit Sub

    List1.RemoveItem (List1.ListIndex)
Open sFichier For Output As #ff
   For i = 1 To List1.ListCount
        Print #ff, List1.List(i)
   Next i
Close #ff

Annuler:
End Sub

Private Sub Form_Load()
    Dim sLigne As String
With Me.dlgNomFichier
    .CancelError = True
    .Filter = "Base de données Access (*.txt)|*.txt"
    .FilterIndex = 1
    .InitDir = App.Path
    On Error GoTo Annuler
    .ShowOpen
End With

    sFichier = Me.dlgNomFichier.FileName

ff = FreeFile

Open sFichier For Input As #ff
    While Not EOF(ff)
        Line Input #ff, sLigne
        Me.List1.AddItem sLigne
    Wend
Close #ff

Annuler:
End Sub

++

signaler à un administrateur
Commentaire de econs le 22/08/2006 07:31:35 administrateur CS

Et oui, 18 lignes, pas de fioritures ... il pouvait même faire moins, mais çà aurait été moins lisible.

signaler à un administrateur
Commentaire de BRICE LA BIDOUILLE le 22/08/2006 09:34:43

Et bien en effet, de la fioriture en pagaille, c'est fou comme on croit faire bien!

En tous les cas merci de vos conseils, désolé d'avoir posté ce code qui a beaucoup de cousins!

Il est vrai que la programmation repond à des règles et des optimisations qui sont encore flous pour moi!
J'avoue que le code présenté ici est du bricolage mais malhereusement pour l'instant c'est la règle de tous mes développements.

Juste pour Icons la boucle:

For compteur = 1 To NbOC
TEMP = Mid(TEMP, InStr(1, TEMP, "\") + 1)
Next

La variable maintes fois écrasé TEMP renvoie la chaîne de texte après le dernier "\" donc le nom de fichier.
en rajoutant après next >
#POSITION_DERNIER_CARACTERE = len(Chemin_complet)- len(TEMP)
On obtient la position du dernier "\" à la façon d'un "instr_der" si je peux me permettre.

Merci encore et je réflécherais à 2 fois avant de poster.



signaler à un administrateur
Commentaire de MrJava_Javaman le 22/08/2006 12:50:34

*** 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 ..

signaler à un administrateur
Commentaire de MrJava_Javaman le 22/08/2006 12:58:01

Oublier de dire que si tu change "gtLignCount" tu dois avec, changer "i" dans la fonction principal surtout si c'est au plus grand ...

signaler à un administrateur
Commentaire de jadot le 28/08/2006 08:49:53

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) ;-)

signaler à un administrateur
Commentaire de mortalino le 28/08/2006 09:36:39

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% !

++

signaler à un administrateur
Commentaire de jadot le 28/08/2006 10:58:51

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."

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

supprimer UNE ligne dans un fichier txt [ par vince ] mon fichier texte contient par exemple 3 lignes de texte. Je souhaite supprimer la 1ere et en rajouter une à la fin (comme une mémoire déroulante).Mer Comment supprimer la première ligne dans un fichier texte? Merci:) [ par Kali ] Je crois que tout est dit dans le titre, j'ai besoin d'automatiser la suppression de la première ligne d'un fichier texte, est-ce possible?Peut-on par Comment supprimer la première ligne dans un fichier texte? Merci:) [ par Kali ] Je crois que tout est dit dans le titre, j'ai besoin d'automatiser la suppression de la première ligne d'un fichier texte, est-ce possible?Peut-on par Supprimer une ligne vide dans un fichier texte [ par zebu001 ] J'aimerais savoir comment supprimer simplement une ligne vide d'un fichier texte.Exemple de mon fichier :popo;toto;momo;lolo;papa;tata;mama;lala;pepe; Supprimer des ligne de ma texte box [ par vinsus51 ] J'ai une text box et je voudrait supprimer les 10 premieres lignes Merci de m'envoyer le code correspondantVinsus Supprimer du texte dans un fichier [ par mbar ] Bonjour, Je cherche à faire la manip suivante.Ouverture d'un fichier texte.Lecture d'une ligne de texte.Si la ligne est correcte, je la supprime du fi Fichier Texte : supprimer une ligne [ par cherrymoon08 ] Bonjour, voila je voudrias savoir si il existe une fonction en VB.net pour supprimer une ligne dans un fichier texte ou alors faut-il remplacer le con Supprimer chaque ligne d'un fichier jusqu'à trouver la bonne [ par yo612 ] Bonsoir,Je souhaite supprimer chaque (premières) lignes d'un fichier qui ne commence par par une date.Bien sûr après la date, il y a des informations Supprimer la 1ère ligne du fichier texte [ par hamardfred ] Slt à tous, pour une petite application en VB6,  j'aurais souhaiter savoir comment suprimer la première ligne d'un fichier texte. J'aurai voulu savoir Supprimer de ligne dans un texte avant une chaine spécifiée [ par FkB ] Bonjour,je cherche, en vbs, à supprimer dans un fichier, toutes les lignes qui se trouvent avant une chaîne de caractères spécifiée dans le vbs.Pouvez


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,435 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.