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 :

Trouver les valeurs min et max dans un fichier CSV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2018
    Messages : 15
    Par défaut Trouver les valeurs min et max dans un fichier CSV
    Bonjour à tous

    Merci de prendre quelques instants pour me lire
    Bon tout d'abord je vous préviens je suis vraiment une brêle en C++ j'ai commencé y'a quelques jours, donc je comprends pas toujours ce que je fais
    Je travaille sur QT Creator 5, windows 7.

    Voila la situation, j'ai une interface Arduino qui envoi une trame de 3 valeurs par le port série. C'est un fait la position d'un codeur et 2 tensions.
    Je suis donc arrivé à me connecter, récupérer la trame, découper la trame en valeur unitaire pour les afficher dans le programme.
    J'ai créée une fonction pour sauvegarder ces valeurs dans un fichier csv. J'ai également ajouter une fenêtre avec le tracage du graphique en temps réel ( QCPCurve)

    Tout ça fonctionne parfaitement, j'arrive maintenant à lire le fichier csv, et séparer les 2 colonnes pour les afficher dans 2 "textEdit" différents
    Mon problème est que j'ai besoin de chercher dans chaque colonne la valeur min et max.
    Avant de poster j'ai procéder à des heures de recherches, sur différents sujets et des heures d'essai de code "au feeling"...mais ça ne fonctionne pas j'aurai vraiment besoin d'un coup de main
    J'ai essayé ça ?! ( encore une fois je comprends pas tjs ce que je fais alors soyez indulgent )
    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
     
    int main()
     {
       QString fichier2= "c:/qt/serial.csv";
       QFile file(fichier2);
       if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
       file.readLine();
       while (!file.atEnd());
     
       QByteArray line = file.readLine();
       QByteArrayList fields {line.split(',')};
       QList<QByteArray> column2 {fields [2] };
     
       QList<int> list;
       std::sort(list.begin(), list.end());
       int iMax = list[0];  //set min and max as the first element
       int iMin = list[0];
       for (int i=1; i>iMax; i++)
     
         if (list[i] < iMin)
           iMin = list[i];
         else
         {
           if (list[i] > iMax)
             iMax = list[i];
                }
           return 0;
    }
    Merci de votre aide précieuse

  2. #2
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 6
    Par défaut
    Bon j'ai avancé un peu cet après midi

    Donc j'ai fait des essais pour voir si j'accedais bien au fichier et à la bon colonne. J'ai donc fait des essais en virant le fichier, ou en changeant les valeurs et ça fonctionne.
    Enfin l'accès est correct.

    Comme je le disais j'arrive bien à afficher la colonne souhaitez dans le textEdit, par contre le retour de la fonction cout me donne n'importe quoi je pense qu'il manque une étape
    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
    void Dialog::on_pushButton_clicked()
    {
     
        QString fichier2= "c:/qt/serial.csv";
        QFile file(fichier2);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
             return;
        file.readLine();
        while (!file.atEnd())
        {
     
        QByteArray line = file.readLine();
        QByteArrayList fields {line.split(';')};
        QByteArray column2 {fields [1] };
        QDataStream in(column2);
     
        auto mm = std::minmax_element(column2.begin(), column2.end());
        std::cout << "min is " << *mm.first;
        std::cout << "max is " << *mm.second;
     
       {
     
     
       ui->textEdit->append(fields[2]);
     
     
     }
    Ca fait des heures que j'y suis et je commence à baisser les armes là

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    Bonjour,

    Tu as appelé une variable column2. Penses-tu avoir récupéré le liste des nombres qui sont dans la colonne 2, si c'était le cas, la fonction std::minmax_element() permettrait en effet de trouver les positions des valeurs extrêmes.
    Si on s'intéresse au type de cette variable : QByteArray, on voit que c'est constitué de quelques caractères (ceux que tu as vu quand tu as cherché à afficher cette colonne.) On est donc loin d'une liste de nombres, il manque donc au moins 2 choses :
    - convertir le champ lu en un nombre.
    - stocker chacun des nombres dans une liste ou un vector.
    - une fois le fichier entièrement parcouru, tu pourras utiliser std::minmax_element().

  4. #4
    Membre averti
    Homme Profil pro
    Technicien conception industrielle
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien conception industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut
    Bonsoir

    Je planche avec Ben sur ce projet avec le même niveau de base en QT/C++. Mais à 2 on avance bien

    Alors merci dalfab de confirmer ce que j'ai en tête pour la conversion des champs en nombres et aussi le fait que fonction nous renvoyer une reponse par ligne et non une pour la colonne global.

    Donc j'ai essayé de lire ligne par ligne mon csv, chaque ligne remplissant une case d'un vector<QstringList> appelé tabfichier2 afin de plus passer par la variable QByteArray

    Je me dis que si on arrive a ranger nos valeurs de cette manière , on devrai pouvoir les convertir en nombre (grace à "todouble" peut etre bien ? ) et ensuite les traiter avec std::minmax_element() (ou par la méthode avec itération )

    Mais jai encore une erreur sur la dernière ligne no viable overloaded'=' ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void MainWindow::on_OUVRIR_clicked()
    {
     
     QFile fichier2("D:/Mes Documents/Arduino/PROJETS YANN/BANC AAC/LOGICIEL/BANC_ARBRE_A_CAMES_V1_0_2/serial2.csv");
     
        if(fichier2.open(QIODevice::ReadOnly|QIODevice::Text))
        {
                QString line;
                for(int i=0; !(line = fichier2.readLine()).isEmpty(); i++)
                {
                   tabfichier2[i] = line.split(';');
                }
            }

    merci à vous

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    Là aussi, il y a une étape de brûlée.
    On ne peut pas convertir par un simple égal 2 objets complexes. D'autant que la simple conversion d'un QByteArray en QString n'est déjà pas si immédiate et pourrait nécessiter des précisions (est-ce que fichier contenait l'Ascii, de l'utf-8, ... la QString nécessite une information pour que les bytes lu sont compris comme des caractères).
    Le moyen simple pourrait être (sous réserve car je ne connais du tout Qt):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     QList<double>  column2;
     while (!file.atEnd())
     {
        QByteArray  line{ file.readLine() };
        QByteArrayList  fields{ line.split(';') };
        column2.append( fields[1].toDouble() );  // les 2 actions que je préconisais
     }
     auto mm = std::minmax_element(column2.begin(), column2.end());
     std::cout << "min of column 2 is " << *mm.first;
     std::cout << "max of column 2 is " << *mm.second;

  6. #6
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 6
    Par défaut
    Tout d'abord merci de votre réponse qui semble tout à fait logique, j'ai essayé votre code et j'ai essayé pas mal de chose mais celle qui semble se rapprocher le plus de ma demande est celle ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        QByteArray line = file.readLine();
        QByteArrayList fields {line.split(';')};
        QByteArray column2 {fields [3]};
        column2 = column2.simplified();
     
        auto mm = std::max_element(column2.begin(), column2.end());
        std::cout << "max" <<  mm;
    donc il va bien chercher cette colonne, mais il me sort tout la réponse en ligne à ligne, j'ai pensé que c'était dû au \n en fin de ligne donc je l'ai enlevé .simplified mais non

    J'arrive pas à convertir ça, ni en QString ou autre ....

    Voila ce que j'ai comme retour

    Nom : developpez.png
Affichages : 967
Taille : 2,4 Ko

  7. #7
    Membre averti
    Homme Profil pro
    Technicien conception industrielle
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien conception industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut
    bon jai un debut de solution je pense

    là , à chaque boucle il me sort bien la bonne valeur de la bonne colonne et converti en type double

    il faut desormais que je remplisse un tableau ou une liste avec la valeur finale de la boucle . ensuite on pourra utiliser minmax jespere.

    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
    //ouverture d'un fichier de donnée type csv et traitement
    void MainWindow::on_OUVRIR_clicked()
    {
     
    QFile file("D:/Mes Documents/Arduino/PROJETS YANN/BANC AAC/LOGICIEL/BANC_ARBRE_A_CAMES_V1_0_2/serial2.csv");
     
        if(file.open(QIODevice::ReadOnly|QIODevice::Text))
     
        QTextStream stream(&file);
     
        while(!file.atEnd())
     
        {
            QString line = file.readLine();
                 QStringList list = line.split(";");
     
                 QStringList columns2 = {list[2]};
                 colonne = columns2[0].toDouble();
     
        qDebug() << colonne;
     
        }
     
     
     
    }

Discussions similaires

  1. trouver les valeurs d'une droite dans une matrice
    Par Liloucha dans le forum MATLAB
    Réponses: 1
    Dernier message: 11/05/2014, 17h24
  2. Question sur les valeur min et max des types ?
    Par doommick31 dans le forum Débuter
    Réponses: 4
    Dernier message: 13/04/2010, 17h35
  3. Récupérer les valeurs d'un noeud dans un fichier XML
    Par yosthegost dans le forum Delphi
    Réponses: 1
    Dernier message: 30/05/2006, 17h38
  4. Mettre les valeurs d'un tableau dans un fichier
    Par ero-sennin dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2006, 13h47
  5. Réponses: 9
    Dernier message: 05/11/2005, 14h59

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