Chercher et supprimer du contenu dans un grand fichier texte

Résolu
Utilisateur anonyme - 30 déc. 2013 à 22:36
 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 !

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
Modifié par ucfoutu le 31/12/2013 à 08:47
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
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
31 déc. 2013 à 11:14
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 déc. 2013 à 12:33
Salut,

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

Instructions SSE 4.2 utilisables ?

ciao...
0
Utilisateur anonyme
31 déc. 2013 à 17:47
@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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 janv. 2014 à 12:38
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
Utilisateur anonyme
1 janv. 2014 à 15:35
Bonjour,
ce n'est pas ce que je veux faire ?
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
1 janv. 2014 à 17:07
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

0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
1 janv. 2014 à 20:29
Bonjour et bonne année

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

 IO.File.Delete(file)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 janv. 2014 à 20:42
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...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
Modifié par ucfoutu le 1/01/2014 à 22:13
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.
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
2 janv. 2014 à 08:47
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
Utilisateur anonyme
6 janv. 2014 à 19:48
Merci cs_Robert33 ça fonctionne nickel !
0
Rejoignez-nous