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

Discussion :

Votre opinion sur les méthodes de comparaison de données ?

  1. #1
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut Votre opinion sur les méthodes de comparaison de données ?
    Bonjour à tous,

    je viens vers vous, afin d'avoir votre opinion sur le choix d'une solution.

    Voila ma question :

    Je veux comparer plusieurs fichiers .csv (tableau de données diverses, nombres, textes, dates, etc). Les tableaux ont un nombre de colonnes et de lignes variables. Parfois je compare 2 tableaux parfois 10 ou plus.

    Mon but est de trouver les points communs dans chaque fichier et d'afficher les lignes des tableaux qui présentent des données communes.

    Pour l'instant, je le fais avec des QList. Ça fonctionne, mais je me demande s'il n' y a pas une autre solution en utilisant peut être un système de base de données ou une bibliothèque qui permet d'afficher directement des fichiers .csv et de travailler dessus.

    Pensez vous que je devrais utiliser une autre solution que les QList afin d'avoir une solution plus conventionnelle ?

    Merci

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour katanaenmousse

    Sans savoir comment tu stockes tes données lues et comment tu fais tes recherches, il est difficile de proposer quelque chose sans savoir si tu l'as déjà testé.

    Je suppose que tu remplis tes QList avec les éléments lu dans les tables (1 QList par table ? 1 item de ta QList = 1 ligne ou 1 cellule de ta table ? Tu connais les types en fonction des n° de colonne ou pas ? Tu recherches tes correspondances en comparant tous les éléments 1 à 1 ?)
    Le principale problème que je vois dans l'utilisation des QList est que les éléments ne sont pas trié et que la recherche est peut être plus longue. L'utilisation d'une QMap peut être intéressant (à tester).

    Voilà comment je ferais :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    struct Reference { QString filename ; int col ; int row }; 
    // référence permettant de retrouver la cellule en fonction du nom, de la colonne et de la ligne
    // tu peux également utiliser une QString si tu veux afficher par exemple les lignes
     
    // les différentes fonctions de conversion
    template<> double fromString<double>(QString str) { return str.toDouble(); }
    template<> QString fromString<QString>(QString str) { return str; }
    template<> QDate fromString<QDate>(QString str) { return QDate::fromString(str); }
     
    // ta classe qui contient tes données lues :
    template <typename T>
    class MultiMap
    {
        QMultiMap< T, Reference > map;
     
    public:
        void insert(T key, Reference ref) { map.insert(key, ref); }
     
        void insert(T key, QFile file, int col) // lit un fichier complet et insert les éléments de la colonne dans la map
        {
            QTextStream stream(&file);
            QString line;
            int row = 0;
            do 
            {
                line = stream.readLine(); // on lit les lignes 1 par 1
                QStringList list = str.split("\t"); // on divise la ligne en cellules
                QString cell = list[col]; // puis on récupère la colonne
                T key = fromString<T>(cell); // on convertit
                insert(key, Reference(file.fileName(), col, row));
                ++row;
            } 
            while (!line.isNull());
        }
     
        void find(QTextStream stream)
        {
            if(map.empty()) return;
            QMultiMap< T, Reference >::const_iterator first = map.begin();
            QMultiMap< T, Reference >::const_iterator second = ++first;
            while(second != map.end())
            {
                if(first.key() == second.key()) // si les 2 clés sont identique, on affiche
                { 
                    stream << first.key() << first.value().filename  
                               << first.value().col  << first.value().row; 
                }
                ++first;
                ++second;
            }
        }
    };
     
    foo(QTextStream stream)
    {
        MultiMap<double> map;
        map.insert("tonfichier.cvs", 3); // insert les éléments de la 3 ème colonne du fichier
        map.insert("tonautrefichier.cvs", 5); // insert les éléments de la 5 ème colonne du fichier
        map.find(stream); // affiche les correspondances (ie les clés en double)
    }
    Tu peux améliorer en ajoutant par exemple une liste des clés en double (tu récupères l'itérateur renvoyé par la fonction QMultiMap::insert et tu compares la clé avec l'itérateur précédant ou suivant).

  3. #3
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut
    Ok pour préciser :

    • les données à lire sont contenues dans des fichiers .csv ;
    • le nombre de colonnes et de lignes des fichiers varient ;
    • les données sont seulement du type QString ;
    • ee nombre de fichiers à comparer varie aussi.


    Donc pour l'instant je l'ai fait avec des QList imbriquées (QList<QList<>>). Ca marche mais pour comparer les données je dois à chaque fois parcourir tous les éléments des QList un à un c'est un peu long...

    Du coup, j pensais que l'on pouvait peut être faire cela avec autre chose pour avoir des recherches plus rapides. Ou encore mieux, peut être y a t il une solution pour accélérer la recherche dans mes QList imbriqués ? :p

    L'exemple qui est donné juste au dessus à base de QMap me semble intéressant.

    Y a t il d autre solutions (je pense notamment à l'emploi d une bibliothèque qui permettrait de travailler directement sur des . csv)

    Ou bien le QMap est elle la meilleure solution ?

    Merci (et merci particulièrement à toi gbdivers)

  4. #4
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut
    Bonjour,

    Finalement, j'ai adopté le QMap et la solution de gbdivers.

    Ça donne un résultat rapidement et ça permet d'avoir un code pas trop "capilotracté"

    Bref ça marche et le code est assez joli donc ca me va

    Merci à toi encore gbdivers

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

Discussions similaires

  1. [Sequoia] Votre avis sur la Méthode
    Par Zorro dans le forum Autres
    Réponses: 5
    Dernier message: 21/05/2008, 16h02
  2. Donnez votre avis sur les articles de Developpez.com
    Par Geronimo dans le forum C++Builder
    Réponses: 13
    Dernier message: 14/01/2007, 22h00
  3. Donnez votre avis sur les articles de Developpez
    Par Anomaly dans le forum Contribuez
    Réponses: 37
    Dernier message: 29/05/2006, 21h48
  4. Votre avis sur les Logos Nouveau / MAJ, Actualisé, etc...
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 32
    Dernier message: 11/09/2004, 01h17

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