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 :

extraire certaines données d'un fichier texte


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Par défaut extraire certaines données d'un fichier texte
    Bonjour,
    Je souhaite extraire les coefficients de plusieurs variables (x0, x1, x2....), à partir de fichiers texte ayant la forme suivante :


    Maximize
    obj: 5x0 + 8x1 + 8x2 + 45x3 + 89x4
    Subject To
    c1: 27x0 + 98x1 + 14x2 + 27x3 + 49x4 <= 242
    Binaries
    x0 x1 x2 x3 x4 End


    Sur l'exemple ci dessus ,les valeurs qui m'interessent sont ainsi :
    5 , 8 , 8 ,45 , 89
    27, 98, 14, 27, 49, 242

    Les fichiers ont tous cette structure mais le nombre de variables change.
    Comment faire pour extraire uniquement les valeurs qui m'interessent? et pour connaitre le nombre de variables pour un fichier?

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Les fichiers ont tous cette structure mais le nombre de variables change.
    Comment faire pour extraire uniquement les valeurs qui m'interessent? et pour connaitre le nombre de variables pour un fichier?
    Ben c'est tout c....! ; Au vu du problème soulevé , il suffit lire chaîne par chaîne dans le fichier et regarder si la chaîne lue est numérique !

    Sinon il faut utiliser des balises parce qu'autrement impossible de s'en sortir.
    Le mieux serait de décoder un fichier XML passé en entrée.
    Il ya des bibliothéques qui font ça .

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Par défaut
    bonjour, quelles sont les bibliptheque qui permettent de transfrmer un fichier text en fichier XML

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Par défaut
    oui mais le pb c'est que par exemple dans la chaine "5x0" il n' ya que le 5 qui m'interesse! comment faire ce tronquage?

  5. #5
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Salut,

    A mon sens (qu'est surement pas le plus intéressant ), je ferais ainsi :

    je parcours la chaine
    1- je trouve un "x" pour l'index i de ma chaine
    2- je reviens en arriere jusqu'à arriver à un charactère non numérique. Je suis alors à l'index j.
    3 - je récupère tous les charactères compris entre l'index j+1 (inclus) et i-1 (inclus) => j'ai ainsi mon coefficient (il faut ensuite le convertir en int)
    4 - je continue de parcourir ma chaîne en partant de l'index i+1

    Cependant, si tu as la possibilité de pouvoir toi même écrire le fichier source, peut-être devrais-tu passer en xml. La lecture te serait beaucoup plus facile.

    Mais avant d'aller plus loin 2 questions :

    - est-ce que c'est toi qui crée et construit le fichier source ?
    - au moment de la création, est-ce que tu connais les coefficients ?

    A+

    Flo.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Par défaut
    salut flo,

    j'aimerais essayer ta méthode, mais pourrais tu me donner les fonctions nécessaires pour parcourir une chaine et surtout pour revenir en arrière?
    Et y'a t-il un moyen de se placer directement à la fin du fichier?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Par défaut
    ps : ce n 'est pas moi qui construit les fichiers, ils me sont donnés tels quels

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Pourquoi se prendre la tête avec XML ? ...
    Surtout que le format est simple.

    Tu pars d'une lecture ligne par ligne (=> FAQ !!)
    A pour certaines lignes tu détectes le type de la prochaine ligne à lire (il semblerait que ton format fonctionen de la sorte). Pour ces lignes particulières, tu peux au choix:
    - Les traiter à la main à coup de find_first_of (bof)
    - Sortir une bibliothèque d'expression régulières comme boost.regex -- ce qui devrait permettre de faire un truc très propre qui peuple automatiquement un vecteur, ou autre structure creuse (map).

    Tu peux également utiliser un parseur. boost.spirit p.ex. si tu as un compilo récent.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Salut,

    voila un code qui semble marcher sur ton exemple.
    Il te faudra remplacer mon ShowMessage par une conversion string vers integer puis stocker dans un vector<int> par exemple l'integer trouvé.

    Ca a l'air long comme ça mais on doit pouvoir remplacer tous ces if. J'ai un peu changer l'algorithme par rapport à celui que j'avais donné précédemment pour ne pas avoir à faire de retour en arriere.

    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
            string text = "";
     
            text += "\nMaximize";
            text += "\nobj: 5x0 + 8x1 + 8x2 + 45x3 + 89x4";
            text += "\nSubject To";
            text += "\nc1: 27x0 + 98x1 + 14x2 + 27x3 + 49x4 <= 242";
            text += "\nBinaries";
            text += "\nx0 x1 x2 x3 x4 End";
     
            // pour stocker le coefficient courrant sous forme de string
            string string_coefficient = "";
     
           // on parcourt la chaîne
            for(int iString1 = 0; iString1 < text.length(); iString1++)
            {
                    // charactere courant
                    string character = text.substr(iString1,1);
     
                    // on vide la chaine si on le charactere courant n'est ni un chiffre ni un x
                    // et on continue avec le charactere suivant
                    // (là les pros du c++ vont sûrement hurler)
                    if((character != "0") &&
                       (character != "1") &&
                       (character != "2") &&
                       (character != "3") &&
                       (character != "4") &&
                       (character != "5") &&
                       (character != "6") &&
                       (character != "7") &&
                       (character != "8") &&
                       (character != "9") &&
                       (character != "x"))
                    {
                            string_coefficient = "";
                            continue;
                    }
     
                     // si on a un "x"
                     if(character == "x")
                     {
                            // si la chaine n'est pas vide, on tient un coefficient
                            if(string_coefficient != "")
                                    // ... a remplacer par un int coeff = str2int(string_coefficient) puis
                                    // a stocker dans un vector<int> par exemple
                                    ShowMessageAnsiString(string_coefficient.c_str()));
     
                            // on vide la chaine pour accueillir un nouveau coefficient
                            string_coefficient = "";
     
                            // et on continue avec le charactere suivant
                            continue;
     
                     }
     
                     // à ce stade character est forcément un chiffre on l'ajoute donc à notre chaine
                     string_coefficient += character;
            }
    A+

    Flo

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Extraire un caractère => operator[]
    Trouver un caractère parmi une liste => std::string::find_first_of
    Il y a aussi un truc pas mal qui s'appelle std::isdigit
    L'extraction de lignes dans un flux, c'est avec std::getline

    Des références sur la lib standard sont référencées dans la FAQ.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    // (là les pros du c++ vont sûrement hurler)
    Ben ça a pas manqué...

    Bon en tout cas, y a plus qu'a mixer le blabla des 2 précédents posts et voilà ta fonction de faite.

    A+

    Flo.

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    J'ai pas hurlé. Juste montré des petits trucs simples pour améliorer.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. extraire les données d'un fichier texte
    Par klue_ dans le forum VBScript
    Réponses: 7
    Dernier message: 23/11/2008, 13h59
  2. extraire les données d'un fichier text vers une table access
    Par djatto dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/09/2008, 17h51
  3. Réponses: 2
    Dernier message: 22/06/2008, 15h41
  4. Pour extraire les données d'un fichier texte
    Par Floch dans le forum Access
    Réponses: 2
    Dernier message: 02/05/2006, 15h01
  5. Extraire des donnés d'un fichier texte
    Par sadsad dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2006, 15h09

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