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

C# Discussion :

Trouver chaîne caractère dans un répertoire contenant plus de 1000 fichiers


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut Trouver chaîne caractère dans un répertoire contenant plus de 1000 fichiers
    Bonjour,

    Quelle méthode dois je utiliser pour faire des recherches rapides dans un répertoire contenant des milliers de fichiers à partir d'une chaîne de caractères ?

    Pour le moment je recherche du côté Linq, est-ce que vous avez mieux ?

    D'avance merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Salut

    Avec ta chaîne de caractère tu cherche quoi dans tes fichiers, leurs nom ? Ou ouvrir le fichier un par un et chercher si ils contiennent ton string ??

    Phixx

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 179
    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 179
    Points : 25 133
    Points
    25 133
    Par défaut
    si les fichiers sont gros, ca sera long, on ne peut pas aller plus vite que le disque dur

    si c'est sur un ssd, tu peux multithreader, sinon ca n'est pas forcément utile

    après si les fichiers sont petits et pour gagner un peu de temps, tu peux faire un thread qui lit un fichier (system.io.file.readalltext), et un thread qui fait un like pour voir si ca contient

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Phixx: oui ouvrir les fichiers un par un pour voir si mon string est dedans

    Pour le moment j'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    public string[] SearchFile()
            {
                string[] files;
                string[] fileFound = new string[] { string.Empty};
                long z = 0;
                string text=string.Empty;
                string searchTerm = "test8";
     
                files = Directory.GetFiles(Path);
                int fileCount = files.GetUpperBound(0) + 1;
     
     
                for (int i = 0; i < fileCount;i++ )
                {
                    text = File.ReadAllText(Path + "\\" + System.IO.Path.GetFileName(files[i]));
     
                    //Convert the string into an array of words
                    string[] source = text.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);
     
                    var matchQuery = from word in source
                          where word.ToLowerInvariant().Contains(searchTerm.ToLowerInvariant())
                          select word;
                    // Count the matches, which executes the query.
                    if (matchQuery.Count()>=1)
                    {
                        if (z>0)
                        {
                            string[] temp = new string[z + 1];
                            Array.Copy(fileFound, temp, Math.Min(fileFound.Length, temp.Length));
                            fileFound = temp;
                            fileFound[z] = System.IO.Path.GetFileName(files[i]);
                        }
                        else
                        {
                            fileFound[z] = System.IO.Path.GetFileName(files[i]);
                        }
     
                        z++;
     
                    }
                }
    Mais comment optimiser ça avec des thread, je ne suis pas habitué (ce n'est pas sur un ssd) ?

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 179
    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 179
    Points : 25 133
    Points
    25 133
    Par défaut
    avant de multithreader, autant voir si c'est utile
    donc utilise un system.Diagnostics.stopwatch englobant ta lecture de tous les fichiers
    tu obtiendra le temps total
    puis la même chose, mais avec juste le readalltext, pour voir le temps de lecture du fichier
    si le temps de lecture > 80% du temps total, alors il y a peu à gagner
    sinon tu peux en effet faire un thread qui va lire et autre qui va traiter (le reste du code de ta boucle principale)
    si le temps de lecture < 30% du temps total alors tu peux même faire plusieurs threads de traitement (enfin si tu as plein de cores sur le pc)

    attention : le temps d'exécution est variable, entre autre à cause du temps de compilation finale, il faut donc faire plusieurs essais pour faire une moyenne du temps obtenu, sans prendre en compte le 1er appel

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 174
    Points : 7 426
    Points
    7 426
    Billets dans le blog
    1
    Par défaut
    Autre solution : utiliser les outils intégrés de Windows, et utiliser le service d'indexation.

    Avantage : pas de lecture des fichiers, mais uniquement d'un index.
    Désavantages : l'index n'est pas toujours mis à jour en temps réel, tous les fichiers ne sont pas indexés, la chaîne indexée n'est pas exactement la même que celle dans le fichier, et on peut avoir des résultats inattendus.

    Après, tout dépend du besoin.

    Si c'est pour retrouver une citation d'un livre parmi une bibliothèque, aucune hésitation : service d'indexation.
    Si c'est pour retrouver le numéro d'une facture dans des fichiers de rapprochement bancaire pas le choix, il faut lire les fichiers un à un.

    http://www.thejoyofcode.com/Using_Wi...lications.aspx

    Sinon, "ReadAllText", je suis pas fan (généralement, je vomis avant de tirer dans le tas).

    Ils font quelle taille tes fichiers ? Car s'ils dépassent quelques Ko, commence par faire une recherche en faisant une lecture par blocs.

    Je vous renvoie vers ce topic, dans lequel j'ai filé des exemples de code pour faire des recherche rapides dans des fichiers volumineux.

    http://www.developpez.net/forums/d14...xt-volumineux/

    A noter que si vos fichiers sont triés à l'intérieur, vous pourrez en plus faire de la dichotomie, ce qui évite de charger tout le fichier.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 179
    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 179
    Points : 25 133
    Points
    25 133
    Par défaut
    c'est vrai que j'ai tendance à conseiller le readall* mais ceci n'est pas toujours idéal
    en effet pour une recherche de "contient", et que ce qu'on recherche est au début du fichier alors on aura lu 99% du fichier pour rien, auquel cas lecture et recherche au fur et à mesure, ce qui peut donc gagner du temps
    après si le fichier contient le truc on doit le lire, alors il n'y a aucun défaut à utiliser readall, même si le fichier fait 10Mo

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Merci à vous deux pour vos conseils je vais tester ça demain et je vous tiens au courant .

    Pour info, les fichiers font entre 1ko et 5ko et c'est pour trouver un chiffre.

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/01/2012, 23h21
  2. Trouver un caractère dans une chaine de caractère
    Par wassim_boy dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/01/2012, 05h36
  3. [XL-2002] Sauter n caractères dans l'utilisation d'un nom de fichier
    Par johan89 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 07/11/2011, 12h22
  4. [Turbo Pascal] Où trouver le caractère > dans le clavier ?
    Par mosaique dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 14/04/2009, 00h57
  5. Réponses: 2
    Dernier message: 17/10/2007, 18h56

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