Chercher et supprimer du contenu dans un grand fichier texte [Résolu]

- - Dernière réponse :  Utilisateur anonyme - 6 janv. 2014 à 19:48
Bonjour,
Je dois chercher et supprimer un grand nombre de lignes dans un fichier texte. Le problème, c'est que j'ai le code mais il est extrêmement long car le fichier contient plus de 800 000 lignes.
Pour vous mettre dans le contexte, mon programme bloque plus de 800 000 sites dangereux en les ajoutant au fichier hosts. Les ajouter est très facile mais les retirer est plus difficile car il faut chercher dans le fichier hosts tout le contenu qui se trouve dans le fichier de site dangereux puis le supprimer.
C'est cette opération qui prend du temps.

    Private Sub DebloquerSitesDangereux()
Dim FichierSiteDangereux As String = ("C:\Users\" & System.Environment.UserName & "\Documents\ListeDeSiteContenusDangereux.txt") 'Emplacement du fichier qui contient les sites dangereux
Dim lines As List(Of String) = System.IO.File.ReadAllLines("C:\Windows\System32\Drivers\etc\hosts").ToList 'Lecture du fichier hosts qui contient déjà le contenu du fichier de sites dangereux
For Each lineASupprimer As String In ListeDeSiteContenusDangereux 'ListeDeSiteContenusDangereux est un listof string chargée précédement qui contient le contenu du fichier de sites dangereux
lines.Remove(lineASupprimer)
Next
System.IO.File.WriteAllLines("C:\Windows\System32\Drivers\etc\hosts", lines) 'On réecrit le hosts sans la liste de site dangereux c'est à dire la listof ListeDeSiteContenusDangereux
End Sub

Merci de votre aide !
Afficher la suite 

11 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bonjour,
Des données dans un fichier texte de 800 000 lignes ?
Je n'ai pas ta solution, mais serais très intéressé (l'hiver s'annonce assez froid) par savoir où et à quel prix tu achètes ton gaz (pour cette usine)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
26
0
Merci
Bonjour

tu veux supprimer toutes les lignes précédemment insérées ou seulement une partie ?

Si c'est toutes les lignes, alors tu peux à l'insertion y ajouter un commentaire, et lors de la suppression filtrer sur ce commentaire, cela évitera la fastidieuse boucle sur la liste des 800 000 sites dangereux.

Si c'est une partie je n'ai pas de solution plus rapide
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Salut,

pourrais-tu fournir un zip de ton fichier texte pour que je fasse tests dessus ?

Instructions SSE 4.2 utilisables ?

ciao...
0
Merci
@cs_Robert33
Je veux supprimer tout le contenu d'une listof string de mon fichier hosts.
Par exemple si le hosts contient :

A
B
C
D
et que ma listof contient :

B
C

Le nouveau fichier hosts sera :


A
D

Si il y a moyen de supprimer directement tout le contenu c'est bien car ma listof est toujours chargée et ce très rapidement lors de l'ouverture du programme car je la réutilise à plusieurs endroits, je la garde donc en mémoire.

@BruNews
Voici le fichier texte :
http://www.petit-fichier.fr/2013/12/31/listedesitedangereux/

Je ne comprends pas : "Instructions SSE 4.2 utilisables ? "

Merci de votre aide.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
http://brunews.com/txtRemLines.zip

Dans zip, exe de 5.75 Ko en vrai code donc aucun besoin d'installeur.

SPEC requises:
- Windows x64, CPU supportant SSE 4.2 mini.

On entre dans le textbox ligne par ligne en appuyant sur bouton 'addLine', ces lignes vont dans listbox dessous.
Avant de lancer l'operation de suppression des lignes (si elles s'y trouvent), on peut sélectionner des lignes de la listbox et les enlever par le bouton 'remSel'.
Le fichier à traiter se DRAG sur la zone tout en haut. ATTENTION que je n'ai pas perdu de temps à vérifier que c'est bien un fichier 'TEXT', donc éviter de lui balancer nimporte quel fichier.
En dernier, appui sur bouton 'GO' et on a le nombre de lignes enlevées qui s'écrivent à coté du bouton.

Sur ma machine de prod, ton fichier met moins d'1 seconde.
Je pense que je pourrais encore aisément gagner 25% en temps de traitement pour une version commerciale.

ciao...
0
Merci
Bonjour,
ce n'est pas ce que je veux faire ?
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
26
0
Merci
Bonjour, et bonne année :-)

J'avais bien compris ce que tu voulais faire, ce que je veux savoir c'est si c'est systématiquement toute la liste des sites dangereux que tu veux enlever.
Bon supposons que oui.

L'idée est d'ajouter un commentaire en fin de ligne de chaque site ex:
127.0.0.1 0--ass-cinema-newsp.da.ru # site dangereux
127.0.0.1 0--fightingshaving.da.ru # site dangereux
127.0.0.1 0--foodwarez.da.ru # site dangereux
...


pour ajouter au fichier host
Private Sub AjoutSites()
      File.AppendAllLines(HostFilename, ListeDeSiteContenusDangereux)
End Sub

pour supprimer du fichier host
Private Sub EnleveSites()
  Dim lines As List(Of String) = New List(Of String)
  For Each line In File.ReadLines(HostFilename).ToList()
    If Not line.EndsWith("# site dangereux") Then
      lines.Add(line)
    End If
  Next
  System.IO.File.WriteAllLines(HostFilename, lines)
End Sub

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
46
0
Merci
Bonjour et bonne année

Pourquoi ne pas effacer le fichier et le réecrire de nouveau

 IO.File.Delete(file)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Faut arreter de delirer, il n'y aura jamais rien d'efficace en interprété. Dès que le prog doit bosser, il faut coder.
Que ce soit Microsoft ou autre, pout tout vrai prog il y a du vrai code.
J'ai montré au post précédent que c'est faisable efficacement et ce n'est ni en .net ni aucune autre daube qu'on fera jamais un vrai logiciel.

ciao...
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215 -
Bonjour, BruNews,
Ah ! Enfin !
Dire les choses brutalement est un signe d'honnêteté que je salue.

Je te suis personnellement très reconnaissant de l'avoir fait.
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
26
0
Merci
Bonjour

En optimisant un tout petit peu on arrive à des temps de traitement tout à fait honorables
0.447 seconde pour l'ajout
0.662 seconde pour la suppression
le temps incompressible, quelque soit le langage, étant les accès disque
Private Sub AjoutSites()
    Using sw As StreamWriter = New StreamWriter(HostFilename, True)
        For Each line In ListeDeSiteContenusDangereux
            sw.WriteLine(line & " # site dangereux")
        Next
    End Using
End Sub
Private Sub EnleveSites()
    Dim lines As List(Of String) = New List(Of String)
    Using sr As StreamReader = New StreamReader(HostFilename)
        Dim line As String = sr.ReadLine()
        While (Not line Is Nothing)
            If Not line.EndsWith("# site dangereux") Then
                lines.Add(line)
            End If
            line = sr.ReadLine()
        End While
    End Using
    File.WriteAllLines(HostFilename, lines)
End Sub

0
Merci
Merci cs_Robert33 ça fonctionne nickel !