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 :

Recherche d'information entre deux fichier *.xls


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 53
    Par défaut Recherche d'information entre deux fichier *.xls
    Bonjours les developpeurs.

    J'ai actuellement deux fichiers *.xls d'environ 95k lignes chacun. Je voudrais extraire des informations entre les deux fichiers selon l'égalité de deux colonnes.

    Exemple : Si Fic1.Col1 == Fic2.Col 7 Alors blabla

    Problème :
    J'utilise un .dll qui s'appelle Net.Sourceforge.Koogra.Excel pour instancer des Workbook et des Worksheets.
    Je dois comparer toutes les lignes des deux fichier entre elles ce qui représente une boucle qui mettrais 68 jours à tourné (j'ai fait les calculs). Ceci est bien trop long ! Je cherche donc un moyen de raccourcir ce temps.

    Je suis ouvert à toutes propositions de solutions

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En gros, pour parler en termes de base de données, tu veux faire une jointure entre les 2 ?

    Le plus simple serait d'extraire les données dans des listes d'objets, et de faire la jointure avec Linq

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 53
    Par défaut
    Oui je veut faire une jointure entre les deux.

    En faite l'algo se résume a ça :

    Pour i = 0 jusqu'a i = Fichier1.MaxRow Faire
    Pour j = 0 jusqu'a j = Fichier2.MaxRow faire

    Si Fichier1.Ligne[i].ColA.Valeur == Fichier2.Ligne[j].ColC.Valeur alors
    Fichier3.WriteLine(Fichier1.ColA ; Fichier2.ColB ; Fichier2.ColD ; etc ...)
    FinSi
    FinPour
    FinPour

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah ben oui, dans ce cas forcément c'est long : 95k lignes * 95k lignes = 9,025 milliards d'accès aux données du fichier Excel, sachant que cet accès n'est probablement pas très rapide...

    Voilà ce que je te suggère :

    • Crée 2 classes : une pour représenter les lignes du fichier 1, et une pour les lignes du fichier 2 (avec une propriété pour chaque colonne)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      class LigneFichier1 // je te laisse trouver un nom plus approprié...
      {
          public string A { get; set; }
          public string B { get; set; }
          ...
      }
       
      class LigneFichier2 // je te laisse trouver un nom plus approprié...
      {
          public string A { get; set; }
          public string B { get; set; }
          ...
      }
    • Lis la totalité des données à partir des fichiers Excel et mets les dans des listes d'objets de ces classes

      Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      Pour chaque ligne dans Fichier1
          lignesFichier1.Add(new LigneFichier1 { A = ligne.ColonneA.Valeur, B = ligne.ColonneB ... });
      Fin Pour
    • Utilise Linq pour faire la jointure :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      var query =
          from ligne1 in lignesFichier1
          join ligne2 in lignesFichier2
              on ligne1.A equals ligne2.C
          select new
          {
              ligne1.A,
              ligne2.B,
              ligne2.D,
              // etc...
          };
    • Ecris dans le fichier 3 les résultats de cette requête :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      foreach(var result in query)
      {
          Fichier3.WriteLine(resultat.A; resultat.B; resultat.D; etc ...)
      }


    Avec cette approche, le contenu de chaque fichier n'est lu qu'une fois, et l'implémentation Linq de Join est bien optimisée. Ce sera peut-être pas encore une fusée, mais ça devrait déjà aller nettement plus vite...

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 53
    Par défaut
    Merci tomlev, je test ça tout de suite (desolé d'avoir mit du temps à répondre)

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 53
    Par défaut
    Je ne comprend pas cet partit la du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var query =
        from ligne1 in lignesFichier1
        join ligne2 in lignesFichier2
            on ligne1.A equals ligne2.C
        select new
        {
            ligne1.A,
            ligne2.B,
            ligne2.D,
            // etc...
        };
    Edit : En faite, c'est bon j'ai comprit (comme quoi avec un peu de patience on arrive à tout).
    Cependant j'ai quand même un problème : je dois Linq sur deux valeur

    exemple : Fic1.A = Fic2.A & Fic1.K = Fic2.K

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour
    Citation Envoyé par Zarrows Voir le message
    J'ai actuellement deux fichiers *.xls d'environ 95k lignes chacun. Je voudrais extraire des informations entre les deux fichiers selon l'égalité de deux colonnes.
    ....
    ...
    Je cherche donc un moyen de raccourcir ce temps.

    Au hasard, faire un import dans deux tables d'un base "in-process" (SQL SERVER CE, ou SqlIte par exemple) ou dans une base normale si tu en as une à ta disposition (ce qui sera plus performant) et traiter cela avec du SQL standard

    EDIT : je n'avais pas vu la réponse de tomlev avant de poster. Donc la mienne est sans objet.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    EDIT : je n'avais pas vu la réponse de tomlev avant de poster. Donc la mienne est sans objet.
    Pas forcément... il faut voir si ce serait pas plus rapide en passant par une DB

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 53
    Par défaut
    Je n'est aucun moyen de faire de base de donnée de toute façon, sinon je suppose que ça aurait été beaucoup plus rapide.

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Zarrows Voir le message
    Je n'est aucun moyen de faire de base de donnée de toute façon,.
    Si, si : les bases "in process" que j'ai mentionnées sont des bibliothèques accessibles en téléchargement et gratuites l'une comme l'autre.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Avec SQLite tu peux même créer une DB qui n'existe qu'en mémoire, sans passer du tout par un fichier (chaine de connexion: "Data Source=:memory:")

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

Discussions similaires

  1. [LibreOffice][Tableur] Fusion soustraction de lignes entre deux fichiers xls/csv
    Par yankyank dans le forum OpenOffice & LibreOffice
    Réponses: 8
    Dernier message: 24/04/2014, 22h01
  2. Réponses: 6
    Dernier message: 13/03/2009, 16h01
  3. Recherche entre deux fichiers
    Par argal dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/07/2008, 14h05
  4. recherche valeur maximale entre deux champs
    Par maysa dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/05/2005, 09h40
  5. [langage] Passage d objet entre deux fichiers
    Par Slippers dans le forum Langage
    Réponses: 2
    Dernier message: 28/04/2005, 14h45

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