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++Builder Discussion :

Extraire des données d'un fichier .csv avec C++


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 19
    Points
    19
    Par défaut Extraire des données d'un fichier .csv avec C++
    Bonjour,

    J'ai un fichier .csv, constitué d'un millier de lignes (dont presque la totalité est inutile pour moi) constituées de caractères ou coordonnées ( lattitude et longitude de 17 chiffres chacunes). Il me faut extraire parmi ces milliers de lignes une trentaine de ligne (correspondant aux coordonnées) séparées les unes des autres.

    Est-il possible de le faire avec C/C++ ?

    Par exemple, existe-t'il un programme qui me permet de détecter parmi tous les caractères présents dans ce texte, les séries de 17 chiffres, ce qui me sortirait directement les coordonnées (tous les autres caractères de ce texte sont des lettres , ou nombres de maximum 3-4 chiffres) ??

    Merci énormement pour votre aide, cela m'aiderait beaucoup.

    Chris

  2. #2
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 309
    Points
    1 309
    Par défaut
    Bonjour, tu peux essayer de te débrouiller avec deux TStringList (une qui contiendra l'ensemble des lignes du fichier, et l'autre qui contiendra chaque élément d'une ligne)...

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //definition du caractère de séparation du CSV  
       char separateurCSV = ',' ;
    //création du TStringList qui contiendra l'ensemble du fichier
      TStringList *fichier = new TStringList();
    //Chargement du fichier : chaque ligne du fichier sera dans une ligne du TStringList
      fichier->LoadFromFile( "D:\\essai.csv" ) ;
     
      TStringList *ligne ;
     
    //boucle sur chaque ligne du fichier
      for( int i=0; i< fichier->Count; i++ )
      {
        ligne = new TStringList() ;
      //chaque élement du TStringList 'ligne' contiendra 1 élement de la ligne i
        ligne->Text = StringReplace(fichier->Strings[i], separateurCSV , "\n", TReplaceFlags()<< rfReplaceAll );
      // on parcours chaque élement de la ligne  
        for(int j=0; j < ligne->Count; j++)
        {
           // on regarde si l'élement fais plus de 16 caractères
           if( ligne->Strings[j].Length() > 16 )
           {
               // Fais ce que tu veux avec tes codes de 17 caractères
               ShowMessage( ligne->Strings[j]) ;
           }
        }
        // libération des ressources 
        delete ligne ;
      }
      // libération des ressources 
      delete fichier ;
    }
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  3. #3
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    oui c'est possible de charger et de faire une recherche dans ton fichier.
    Pour ca, il faut que tu jettes un œil dans la FAQ pour ces deux points séparément, travaillons de manière structurée.

    Pour le chargement de ton fichier csv, regarde du côté des TStringList dans la FAQ et dans ce forum, il y a déjà eu énormément de sujet sur ce point.

    Pour ta recherche, il faut que tu manipules les AnsiString avec les méthodes .Pos() et autres ...

    Si tu coinces sur un de ces deux points, reviens poster
    Bon courage

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Alors merci déjà à vous deux d'avoir répondu aussi vite!

    J'ai une question (oui je suis pas une flèche ..)
    -je comprends pas ce que fait exactement le TstringList? Ca sort toute une ligne de mon fichier .csv ?

    Ensuite, pour vous éclairer un minimum, les lignes que je veux extraires sont de cette forme :

    <coordinates>0.6903333333333334,42.92700000000001,0</coordinates>

    Moi je veux sortir en gros , lattitude[i] =0.69033333 longitude[i]=42.927000001

    Est-ce que le fait que les nombres soient collés à <coordinate> et ',' ne posera pas un problème dans le comptage des caractères?

    Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    En fait , il me faudrait dans un premier temps extraire les lignes commencant par <coordinate>, et de cette extraction en extraire les deux séries de chiffres (j'ai vérifié et les coordonnées sont parfois inférieures à 4 caractère ce qui fausse tout, je suis désolé de vous avoir donné de fausses infos..).

    C'est peut-être moins galère (ou plus facile) comme cela non ?

    Mercii

  6. #6
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 309
    Points
    1 309
    Par défaut
    Citation Envoyé par cre31400 Voir le message
    Alors merci déjà à vous deux d'avoir répondu aussi vite!

    J'ai une question (oui je suis pas une flèche ..)
    -je comprends pas ce que fait exactement le TstringList? Ca sort toute une ligne de mon fichier .csv ?
    TStringList est (comme sont nom l'indique) une liste de strings (=chaine de caractères). Tu peux soit gerer toi meme les chaine de caractère en utilisant Add, Delete ou Insert, soit utiliser la methode LoadFromFile qui chargera un fichier en le lisant ligne par ligne.

    Pour comprendre ce que fais un TStringList, un petit exemple illustratif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TStringList *essai = new TStringList() ;
    essai->LoadFromFile("C:\\MonFichier.csv");
    for(int i=0; i<essai->Count; i++)
    {
      ShowMessage("La ligne n° " + IntToStr(i) + " est:\n\n" + essai->Strings[i] ) ;
    }
     
    delete essai ;

    Sinon regarde dans l'aide (F1) ou tape TStringList sur Google tu aura plein d'exmeple
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  7. #7
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    Petit exemple:
    En globale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TStringList *FichierCSV;
    Dans ton code:
    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
     
        int i=0;
     
        if(OpenDialog1->Execute())
        {
            FichierCSV = new TStringList();
            FichierCSV->LoadFromFile(OpenDialog1->FileName);
            while(i<FichierCSV->Count)
            {
                //si la ligne ne contient pas "<coordinate>", on la supprime
                if(FichierCSV->Strings[i].Pos("<coordinate>") == 0)
                {
                    FichierCSV->Delete(i);//supprime la ligne qui ne contient pas le texte
                    i--;//recale l'index, vu que le nombre de ligne à changé
                }
                i++;
            }
        }
    Du coup, dans FichierCSV il n'y a que les lignes avec "<coordinate>" dedans.
    Tu peux aussi utiliser la méthode .Pos() pour chercher autre chose. De la même manière, il existe .Delete() pour supprimer, .SubString() pour extraire une chaîne, .Insert() pour insérer des caractères...
    Essaye chacune des méthodes et appuie sur F1, tu auras plein d'info sur la manière de s'en servir.

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup !! j'essairai cela lundi dès que j'aurai accès à mes programmes! mais ça à l'air bon comme ca!!! merci beaucoup !!

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    alors une fois que j'aurais extrait les lignes qui m'intéressent, j'obtiendrais un fichier à peu près comme ca :

    [espace][espace]<name>name1</name>
    [espace][espace]<coordinate>longitude1,lattitude1</coordinate>
    [espace][espace]<name>name2</name>
    [espace][espace]<coordinate>longitude2,lattitude2</coordinate>
    [espace][espace]<name>name3</name>
    [espace][espace]<coordinate>longitude3,lattitude3</coordinate>

    Je voudrais savoir si il existe une commande qui me permettrait d'extraire les noms et coordonnées, sous la forme:
    name1 longitude1,lattitude1
    name2 longitude2, lattitude2
    etc.

    J'ai pensé à "strchr" mais il me faut connaitre les noms et les coordonnées, ce que je ne connais pas à l'avance, ou peut-être utiliser strstr, et effacer <name> et <coordinates>?

    Merci beaucoup pour votre aide!

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut cre31400
    Peut etre en utilisant la Fonction " StringReplace " pour remplacer les chaines qui te genent par un separateur CSV (" soit " , " soit " ; ")
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  11. #11
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    'lo
    moi je trouve que ça fait pas trop fichier CSV ton problème mais plutot fichier XML.

    me trompe-je?
    si c'est le cas, l'approche pourrait être différente...
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    pareil xml inside

    toutes ces balises

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 81
    Points
    81
    Par défaut
    Salut cre31400,

    As-tu regardé du coté des expressions régulières ... très puissantes!

    http://www.developpez.com/delphi/faq/?page=regex

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Salut,

    Alors le fichier est bien un .csv (un fichier .kml que j'ai ouvert avec excel) .
    Je vais regarder le lien du dessus cela m'aidera surment.
    Mercii à tous!!!!!

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    salut,

    Bon j'arrive à avoir ce que je voulais (presque), c'est-à-dire :
    nom1
    latt1,long1
    nom2
    latt2,long1=2
    nom3
    latt3,long3
    ..

    Est-il possible d'obtenir
    nom1 latt1 long1
    nom2 latt2 long2
    ...

    ??

    Mercii

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

Discussions similaires

  1. [XL-2007] Extraire des données d'un fichier Xml avec des balises identiques
    Par Danieldu54 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/03/2011, 21h45
  2. [Batch] Extraire des données d'un fichier CSV
    Par soufianekh dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 27/10/2009, 14h34
  3. Extraire des données d'un Fichier .csv
    Par wolverine1987 dans le forum MFC
    Réponses: 47
    Dernier message: 20/05/2009, 16h48
  4. Réponses: 14
    Dernier message: 16/07/2008, 12h47
  5. Extraire des données dans un fichier .csv
    Par orj30754 dans le forum C
    Réponses: 7
    Dernier message: 03/11/2006, 15h48

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