IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Supprimer une ligne précise d'un fichier texte.


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut Supprimer une ligne précise d'un fichier texte.
    Bonjour les amis !
    Je voudrais supprimer une ligne précise d'un fichier texte, je pense qu'il faut d'abord le "lire" donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            For Each line As String In lines
                If line.Contains("Ma ligne à supprimer") Then
     
    'Mais je suis bloqué !
                End If
            Next
    Merci de votre aide
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232

  3. #3
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Salut,
    j'avais déjà cherché sur google mais je n'avais pas trouvé ça. J'ai utilisé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim lines as list(of string) = system.io.file.readalllines("x:\fichier.txt").tolist
    for i as integer = 0 to lines.count -1
      if lines(i).contains("teste") then 
        lines.removeat(i)
      end if
    next
    Mais lorsque le code entre en action à la ligne if lines(i).contains... J'ai cette erreur :



    C'est pas parce que je modifie le fichier host ?
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    supprimer des choses dans une collection qu'on parcours pose souvent des problèmes
    en plus il y a un bug de conception dans ton code :
    si tu removeat(5), le i suivant sera 6 , or le removeat fait que l'item 6 passe en 5ème position ( vu que tu viens de supprimer le 5)
    donc il faudrait retester l'item 5 alors que tu passes au 6 donc un item passe à la trappe sur le test

    ca peut se corriger, mais sinon avec linq to object ca peut s'écrire en plus court

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim lignes() as string = system.io.file.Readalllines(path)
    dim lignesWrite = (from l as string in lignes where not l.contains("test") select l).toarray
    system.io.file.writealllines(path,lignesWrite)
    pour les gros fichiers (> 100Mo), il ne faut pas charger tout le fichier en ram, mais lire ligne par ligne, et écrire ligne par ligne dans un autre fichier au fur et à mesure (puis delete et rename des fichiers si c'était pour un replace)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Salut,
    merci ton code marche nickel ! Juste est-ce que tu pourrais me l'expliquer car je ne comprends pas trop et puis j'aimerais le modifier pour qu'il supprimer plusieurs lignes en même temps.
    Merci.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le principe est le même que ton code
    lire les lignes et les stocker dans un tableau
    supprimer les lignes qu'on ne veut pas
    écrire les lignes dans le fichier par dessus l'ancien contenu

    pour la suppression j'utilise linq to object, c'est une "méthode d'écriture de code proche du fonctionnel" ca commence par from et ensuite on a une panoplie de choix de ce qu'on veux écrire, un peu comme le langage sql

    dim lignesWrite() as string : je créé une variable tableau qui sera l'équivalent de lignes, mais sans les lignes qu'on ne veut pas, par recopie
    = (from l as string in lignes where not l.containts("test") select l).toarray

    from l as string in lignes : on spécifie la collection qu'on veut parcourir (équivalent du for each)
    where not l.containts("test") condition de sélection
    select l : qu'est ce qu'on sélectionne pour chaque item traité par le "for each"

    on peut rajouter de l'order by ou plein d'autres choses (jointures, u nautre from pour parcourir une collection les éléments parcourus...)
    dans le select on fait ce qu'on veut aussi, on peut faire select new telleclasse with {telle propriété = tellevaleur de l'élément parcouru}


    cependant ce n'est peut être pas la meilleure méthode, car il y a une recopie donc une perte de ram, et peut etre de temps (très peu significatif sur des fichiers jusqu'à quelques Mo)
    mais le but de linq to sql est surtout de gagner en ligne de code et en lisibilité (la lisibilité on y croit peut etre pas au début, mais une fois qu'on a compris la syntaxe ca se lit bien ^^)

    ca peut aussi s'écrire avec lignes.Where (function de predicat)
    ca revient au même, ca fait un for each, et ca retourne une nouvelle collection filtrée

    si tu as plusieurs contenu que tu ne veux pas, le mieux est de les mettres dans une collection (type list(of ))
    puis de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writeallbytes(path, ligneslues.except(lignesquejeveuxpas).toarray)
    c'est encore plus court et plus compréhensible
    par contre c'est sensible à la casse, pour désensibilisé tu peux faire du .tolower mais pas via except
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Re,
    merci pour tes explications, j'ai compris le principe mais j'avoue que la syntaxe et les méthodes utilisées j'ai du mal.
    Donc pour enlever mes lignes j'ai fais ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim lignes() as string = system.io.file.Readalllines(path)
            System.IO.File.WriteAllBytes(path, lignes.Except("Ma première ligne" & "Ma deuxième ligne".ToArray))
    Mais j'ai l'erreur :

    Impossible d'effectuer un cast d'un objet de type 'System.String' en type 'System.Collections.Generic.IEnumerable`1[System.String]'.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le & en vb.net concatène, donc tu as un seul string sur lequel tu fais.ToArray, ca ne convient pas du tout

    et il n'y a pas besoin d'avoir un array pour l'except ca prend un peu tout et n'importe quoi en paramètre (enfin IEnumerable surement)

    le mieux est de déclarer un list
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim ce_que_je_veux_pas as new list(of string)
    ce_que_je_veux_pas.add("ceci")
    ce_que_je_veux_pas.add("cela")
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Re,
    Tout marche !!! J'ai juste du modifier la dernière ligne WriteAllLines et non WriteAllByte si non ça faisait une erreur de conversion.
    Je poste donc le code complet pour supprimer des valeurs ( je trouve énormément plus simple le dernier code que tu m'a donné plus tôt que le premier )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim path As String = "Emplacement de votre fichier .txt"
    Dim lignes() As String = System.IO.File.ReadAllLines(path)
            Dim ASupprimer As New List(Of String)
            ASupprimer.Add("Votre première ligne")
            ASupprimer.Add("Votre deuxième ligne")
            System.IO.File.WriteAllLines(path, lignes.Except(ASupprimer))
    Merci de l'aide que vous m'avez apporté !
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Ecrire à une ligne précise dans un fichier texte
    Par Oromis56 dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/04/2015, 17h49
  2. Insérer du texte à une ligne précise d'un fichier
    Par darkman19320 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 08/12/2011, 14h12
  3. Supprimer une ligne vide dans un fichier texte
    Par Tibà22 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/04/2011, 16h58
  4. Lire une ligne précise d'un fichier texte
    Par Junta dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 23/04/2009, 18h26
  5. Réponses: 1
    Dernier message: 20/09/2007, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo