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 :

Utiliser les données d'un fichier csv en main


Sujet :

C++

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Utiliser les données d'un fichier csv en main
    Bonjour,

    J'i besoin de votre ade svp en fait je débute en c++, j'ai une classe patient qui hérite de la classe personne, j'ai deux fonctions que j'utilise une fonction pour remplir un vecteur d'objets de patient avec des latitudes et longitudes ..
    Fonction qui calcule la distance entre deux données GPS données
    comme suit :

    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
     
    /*------ Patient function that fill a vector with random Latitude and longitude----*/
    void Patient:: fillPatient(vector <Patient>&  NewPatient)
     {
         int etat =0;
           double LatPa;
             double LongPa;
         double min1 = 45.173886;
         double max1 = 45.213861;
         double min = 0.673541;
         double max = 0.747362;
         //unsigned int size = NewPatient.size();
         for (unsigned int i =0; i<100; i++){
                LatPa = min1 + ((max1 - min1) * (rand () / (double) RAND_MAX));
                LongPa = min + ((max - min) * (rand () / (double) RAND_MAX));
                etat ++;
                Patient NewPat(etat,LatPa, LongPa);
                NewPatient.push_back(NewPat);
        }
     
     }
    /*-------- function calculate distance ------*/
    double Personne::distance( double latA, double longA, double latB, double longB )    // latitude and longitude of arbitrary entities
    {
       constexpr double degToRad = 3.14159265358979 / 180.0;      // conversion factor, evaluated at compile time
       const double radEarth = 6371;                              // mean radius of the earth in km
     
       latA  *= degToRad;                                         // convert to radians (if originally in degrees)
       longA *= degToRad;
       latB  *= degToRad;
       longB *= degToRad;
     
       double cosAngle = sin( latA ) * sin( latB ) + cos( latA ) * cos( latB ) * cos( longA - longB );
                       // cosine of angle between position vectors, from spherical coordinates and dot product
     
       return radEarth * acos( cosAngle );                        // great-circle distance ( "r x theta" )
    }
    Après j'ai un fichier csv qui contient des latitudes et des longitudes il contient deux colonnes et 379 ligne , en effet je veux appeler la fonction qui calcule la distance de telle sorte qu'elle calcule la distance avec les patients générés aléatoirement et la latitude et longitude des medecins contenu dans un fichier csv

    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
     
    /*------main function -------*/
    int main()
    {
    ifstream myfile ("C:/Program Files/text.csv");//file that contains latitude and longitude of doctors and it has 2 columns and 379 lignes 
     
        int lineNumber = 0;
        int lineNumberSought = 400;  // you may get it as argument
    /*------ Reation d'un vecteur d'objets Patients------*/
    vector <Patient> myPat;
     
    Patient::fillPatient(myPat);
     
    if (myfile.is_open())
    	 {
            while (getline(myfile,line)) {
     
     
                    istringstream myline(line);
     
                            while(getline(myline, csvItem, ';')) {
                        //cout << csvItem << endl;
     
                   for ( k = 0; k < 2; k++ ){
                             // for (int j =0;j<4; j++){
                           for( j =0; j <379 ; j++ ){
                              distanc[j][i] =  atof(csvItem.c_str());
                             double dist = Personne::distance(myPat[k].GetLat(), myPat[k].GetLong(), distanc[j][0] ,distanc[j][1] );
     
                            cout << "The distance between patient" << k + 1 << " and doctor " << j + 1 << " is " << dist << "km " << endl;
                           }
     
                   // k++;
     
     
            }
            myfile.close();
        }}}}//}
        else
    	{
    		cout << "pas de fichier"<<endl;
    	}
    le probleme et dans l'appel de la fonction de tel sorte qu'elle calcule la distance entre un nombre de patients et tous les medecins dans le fichier !

    Nom : c++.PNG
Affichages : 235
Taille : 33,0 Ko

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Si j'étais toi, je commencerais par créer la notion de ... coordonnée GPS pour qu'elle puisse être utilisée dans ton code.

    Elle pourrait prendre la forme la plus simple possible d'une structure proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Coordinate{
        double longitude;
        double latitude:
    };
    Et, comme tu va principalement t'amuser à calculer les distances qui séparent deux coordonnées GPS, tu auras sans doute besoin d'une fonction identique à ce que tu as fais pour ta classe Patient, mais, qui manipule directement les deux coordonnées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double distance(Coordinate const & a, coordinate const & b){
        /* ... */
    }
    Une fois que ce sera fait, tu pourras utiliser cette structure strictement "partout où tu en as besoin", comme, par exemple:
    pour maintenir les coordoonées auxquelles se trouvent les différents médecins de ton fichier, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Coordinate> toubibs;
    l'utiliser pour représenter les coordonnées GPS de ton patient, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Patient{
    public:
        Patient(std::string nom, std::string prenom, Coordinate const &);
        Coordinate const & coordinate() const{
            return coordinate_;
       }
    };
    Note que les toubibs ont aussi au minimum un nom (un prénom) et une coordonnée... Il pourraient donc être représenté sous une forme similaire (et le sont peut être dans ton fichier CSV)

    Toujours est-il que l'idée, c'est de lire une seule fois ton fichier CSV, et de maintenir les coordonnées que tu en extrait dans "une collection adaptée" (par exemple, un std::vector). Une fois que ce sera fait, si tu veux calculer la distance entre une coordonnée GPS et les différentes données que tu as extrait de ton fichier, il "suffira" d'utiliser une boucle qui pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(auto const & b : toubibs){
        auto dist = distance(patient.coordinate(), b) ;
        /* tu fais ce que tu veux du résultat ici ;) */
    }
    et le tour sera joué

Discussions similaires

  1. Utiliser les données d'un fichier CSV
    Par Mirelvi dans le forum Android
    Réponses: 13
    Dernier message: 22/03/2013, 14h28
  2. Réponses: 1
    Dernier message: 09/01/2012, 14h49
  3. Réponses: 5
    Dernier message: 22/06/2009, 23h10
  4. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59
  5. Sauvegarder les données dans un fichier CSV
    Par beb30 dans le forum MFC
    Réponses: 5
    Dernier message: 08/03/2006, 13h06

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