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

Documents Java Discussion :

Parsing des fichiers Excel


Sujet :

Documents Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Parsing des fichiers Excel
    Bonjour,
    Je me permets de poster sur le forum parce que j'aimerais avoir vos conseils.
    Je suis en stage ingénieur en informatique, je dois réaliser un module qui compare deux gros fichiers excel (dans les 3000 lignes) générés par le système de l'entreprise.

    la ligne contient des informations sur des employés, par exemple un employé A a 5 lignes dans le fichier. je peux les récupérer dans une collection d'objet Employé.

    Le problème c'est que ça fait trop de memoire utilisé (1000 objets pour chaque fichier) donc je cherche à optimiser la recherche.



    *J'ai proposé de mettre un des deux fichiers dans une table de base de données, je parcoure séquentiellement l'autre fichier objet par objet et chercher et extraire l'enregistrement équivalent (le meme id) dans la base de données grace à une requete select chere id= (possiblité d'utilier hibernate).

    le problème c'est que ça nécessite un SGBD alors que ce module doit être le plus léger possible et facilement distribuable.

    Vous pouver m'éclairer avec quelques idées, qui m'aideront à trouver un moyen plus simple, et surtout plus rapide. (J'ai pensé à XML et XQUERY que je connais pas).

    Je vous remercie d'avance

  2. #2
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Si je résume, tu as 2 fichiers : employes-1.xls et employes-2.xls. Ces fichiers contiennent des infos sur les employés. Du coup je suppose que tu as une classe Employe et les éventuelles classes liées comme Adresse, Voiture, etc.

    Et tes fichiers font grosso modo 3000 lignes. Donc même si une ligne ne correspond qu'à un seul employé, je dirais que tu devrais avoir 3000 objets Employe pour le fichier 1 et autant pour le fichier 2... Ca me parait relativement raisonnable d'avoir tout en mémoire, même si ce n'est pas le top.

    Tu peux utiliser des Map (HashMap) pour stoker tes Employe en mémoire...
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre réponse.
    En effet, vous avez bien compris.
    Dans l'entreprise, on utilise deux systèmes différents qui générent 2 fichiers xls contenant normalement les mêmes informations sur les employés et leur fiche de paie.
    Je dois détécter les erreurs en comparant les 2 fichiers.
    Donc vous me confirmer que ça géne pas le traitement, si je mets 3000 objets dans un maptree?
    Dans ce cas qu'elle est la meilleure structure (maptree,hashmap) pour optimiser le temps de recherche? j'ai pensé à maptree, ce sont des arbres binaiers de recherche?
    Merci d'avance

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Concernant le choix de l'implémentation de la map, en général on utilise des HashMap sauf si l'ordre importe ! Car cela consiste en grande majorité à comparer des entiers (hash) ce qui va plus vite que de comparer le contenu des objets.

    Concernant la base de données, tu as des bases de données qui ont un fonctionnement "embedded" comme MySQL et Firebird.

    Concernant le volume de données, il faut vérifier que les paramètres mémoires de ta JVM sont correctement proportionnés.
    Le nombre de d'objet n'est pas suffisant pour déterminer si c'est trop ou pas assez, ca dépend des informations à stocker et de la quantité de mémoire disponible.

    Concernant l'algorithme, si tes fichiers sont triés (ou si tu peux les trier), utilises un algorithme d'appareillage. Ce qui te permet de conserver en mémoire uniquement un enregistrement par fichier.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Franchement, avec 3000 objets (x2) en mémoire, tu peux bien utiliser n'importe quel type de map... Le temps passé à faire un choix sera déjà supérieur à tout ce que tu peux espérer gagner.

    On parle d'optimisation quand un processus est récurent ou que la quantité d'info est immense. A priori, toi c'est pour un "one shoot" et avec assez peu de données finalement.

    Tu vas avoir quelque chose du style...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Map<String, Employe> map1 = new HashMap...
    Map<String, Employe> map2 = new HashMap...
     
    charger(map1, excel1)
    charger(map2, excel2)
     
    comparer(map1, map2)
    comparer(map2, map1)
    Après, tu prends les clés de map1 et tu regardes ce que ça donne sur map2, puis inversement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    comparer(map1, map2) {
      for(String nom : map1.keyset()) {
        Employe employe1 = map1.get(nom)
        Employe employe2 = map2.get(nom)
        if(employe2 == null) {
          // a mettre dans liste des absents
        } else {
          // do comparaison...
        }
     
      }
    }
    Tu peux aussi utiliser guava (par exemple) pour faire des tris/filtres avec des algo de prog fonc.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    finalement en testant plusieurs types de map et de set j'ai pu insérer 9000 objets dans un TreeSet dans 25 ms, c'est ultra rapide. par contre ce qui est long c'est la lecture des fichiers excel avec jxl (100 ms par employée) donc je suis entrain de chercher une autre solution pour le parsing des .xls en convervant la rapidité des TreeSet.
    Merci beaucoup pour votre aide
    Cordialement

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

Discussions similaires

  1. [Excel] Comment lire des fichiers excel avec php?
    Par dear_rihab dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 02/11/2007, 12h38
  2. Gestion en vba des fichiers excel en mode multiutilisateurs
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/12/2005, 16h06
  3. Réponses: 17
    Dernier message: 20/09/2005, 21h18
  4. Réponses: 1
    Dernier message: 24/07/2005, 22h25
  5. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

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