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#

  1. #1
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    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
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    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
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    Merci tomlev, je test ça tout de suite (desolé d'avoir mit du temps à répondre)

  6. #6
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    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
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par Zarrows Voir le message
    lignesFichier1 est égal a ma collection ?
    Oui, lignesFichier1 est une List<LigneFichier1>
    Citation Envoyé par Zarrows Voir le message
    Comment dans le select new il va savoir que c'est une nouvelle ligne ?
    Ce n'est pas une nouvelle ligne. Pour chaque correspondance entre une ligne du fichier 1 et une ligne du fichier 2, ça crée un nouvel objet anonyme qui regroupe les infos qui t'intéressent dans les 2 lignes.

    C'est le même principe qu'en SQL, si tu avais fais un truc comme ça :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ligne1.A, ligne2.B, ligne2.D ...
    FROM fichier1 ligne1
    JOIN fichier2 ligne2 ON ligne1.A = ligne2.C

  8. #8
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    Je te remerci de ton aide tomlev !

    J'ai encore un problème (décidement ) Je voudrais avoir la colonne P de mon fichier 1 et la colonne P de mon fichier 2 mais il me dit qu'un type anonyme ne peut avoir plusieurs propriété du même nom.

    Et je sais pas si le multi join que j'ai fait est correct :

    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
    var query =
     from LigneF in ColFic1
     join LigneO1 in ColFic2
      on LigneF.C equals Ligne01.C
     join LigneO2 in ColFic2 //je suis pas sur que ça soit correct
      on LigneF.F equals LigneO2.B
    select new
    {
     
       LigneO1.C,
       LigneO1.B,
       LigneO1.C,
       LigneO1.D,
       LigneO1.E,
       LigneO1.B,
       LigneO1.F,
       LigneO1.H,
       LigneO1.I,
       LigneO1.J,
       LigneO1.P
     
       //Blabla...
     
       LigneF.P, //Problème ici
       LigneF.A
     
    };

  9. #9
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Tu peux donner un nom explicitement :

    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
    ...
    select new
    {
     
       LigneO1.C,
       LigneO1.B,
       LigneO1.C,
       LigneO1.D,
       LigneO1.E,
       LigneO1.B,
       LigneO1.F,
       LigneO1.H,
       LigneO1.I,
       LigneO1.J,
       P1 = LigneO1.P
     
       //Blabla...
     
       P2 = LigneF.P,
       LigneF.A
     
    };

  10. #10
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    C'est à dire ? P est déclarer comment ?

  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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par Zarrows Voir le message
    Et je sais pas si le multi join que j'ai fait est correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var query =
     from LigneF in ColFic1
     join LigneO1 in ColFic2
      on LigneF.C equals Ligne01.C
     join LigneO2 in ColFic2 //je suis pas sur que ça soit correct
      on LigneF.F equals LigneO2.B
    ...
    Si tu veux faire une jointure selon 2 critères, c'est comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     from LigneF in ColFic1
     join LigneO in ColFic2
      on new { LigneF.C, ligneF.F } equals new { LigneO.C, ligne O.B }
    Ce que tu as écrit a aussi un sens, mais pas le même : ça associe à chaque ligne du fichier1 2 lignes du fichier2 (selon un autre critère)

  12. #12
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par Zarrows Voir le message
    C'est à dire ? P est déclarer comment ?
    Je comprends pas ta question

    Tu as 2 "P" à récupérer, mais tu ne peux pas avoir 2 propriétés avec le même nom (logique, sinon on ne sait pas de laquelle tu parles). Donc il faut leur donner un autre nom dans le résultat. Qu'est-ce qui pose problème ?

    Et je sais pas si tu as vu mon dernier message, on a posté quasiment en même temps...

  13. #13
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     from LigneF in ColFic1
     join LigneO in ColFic2
      on new { LigneF.C, ligneF.F } equals new { LigneO.C, ligne O.B }
    à la ligne
    join LigneO in ColFic2 il me dit en soulignant join :

    Le type de l'une des expressions dans la clause join est incorrect. L'inférence de type a échoué dans l'appel 'Join'.
    edit : oui, oui c'est bon t'inquiete pas j'en loupe pas une miettes ! Mais c'est bon pour l'histoire de P j'ai comprit, c'est une sorte d'alias en SQL.

  14. #14
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par Zarrows Voir le message
    à la ligne
    il me dit en soulignant join :

    Le type de l'une des expressions dans la clause join est incorrect. L'inférence de type a échoué dans l'appel 'Join'.
    Ah oui, il faut que les clés aient le même type (et donc les mêmes noms de propriétés) des deux côtés du Equals. Comme ça, ça devrait passer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on new { Key1 = LigneF.C, Key2 = ligneF.F } equals new { Key1 = LigneO.C, Key2 = ligne O.B }

  15. #15
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    Wah trop fort Merci bien !

    Bon je testerais le temps de réponse de cet méthode lundi. Merci beaucoup pour ton aide tomlev !

  16. #16
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    J'ai gagné 67 jour et 23h20 ! Merci tomlev je met en résolu !

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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.

  18. #18
    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 : 42
    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
    Points : 39 754
    Points
    39 754
    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

  19. #19
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    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.

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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