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 des données


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2013
    Messages : 2
    Par défaut Extraire des données
    Bonsoir,

    dans le cadre d'un projet de bioinformatique, je dois entre autre extraire des données d'un très gros fichier (2Go). Je vous donne un exemple du fichier.txt d'où je dois extraire les données :

    # BLASTP 2.2.26+
    # Query: ACLAME|114327|GenBankID:3338444
    # Database: ../db/20nov2012dbready
    # Fields: query id, subject id, % identity, alignment length, mismatches, gap opens, q. start, q. end, s. start, s. end, evalue, bit score
    # 250 hits found
    ACLAME|114327|GenBankID:3338444 l62184597refNC_006912.faa 100.00 271 0 0 1 271 1 271 0.0 561
    ACLAME|114327|GenBankID:3338444 l190015885refNC_010849.faa 43.67 229 122 4 1 226 1 225 1e-54 186
    ACLAME|114327|GenBankID:3338444 l385800977refNC_017455.faa 33.33 228 135 6 1 226 1 213 9e-29 117
    ACLAME|114327|GenBankID:3338444 l269958184refNC_013531.faa 35.74 249 143 6 1 239 1 242 1e-28 118
    ACLAME|114327|GenBankID:3338444 l188994119refNC_010729.faa 31.40 242 149 6 1 240 1 227 7e-28 115
    ACLAME|114327|GenBankID:3338444 l389870241refNC_017962.faa 29.43 282 158 9 1 268 1 255 1e-27 115
    ACLAME|114327|GenBankID:3338444 l320152811refNC_014959.faa 29.43 282 158 9 1 268 6 260 1e-27 115
    ACLAME|114327|GenBankID:3338444 l32470489refNC_005000.faa 29.43 282 158 9 1 268 6 260 1e-27 115
    ACLAME|114327|GenBankID:3338444 l334146227refNC_015571.faa 31.40 242 149 6 1 240 1 227 1e-27 114
    ACLAME|114327|GenBankID:3338444 l392988249refNC_018081.faa 33.77 228 134 6 1 226 1 213 2e-27 114
    ACLAME|114327|GenBankID:3338444 l34540005refNC_002950.faa 31.40 242 149 6 1 240 1 227 2e-27 114
    ACLAME|114327|GenBankID:3338444 l383315344refNC_017032.faa 29.08 282 159 9 1 268 6 260 3e-27 114
    ACLAME|114327|GenBankID:3338444 l379754922refNC_016947.faa 36.17 235 130 7 2 230 33 253 3e-27 114
    ACLAME|114327|GenBankID:3338444 l379762413refNC_016948.faa 36.17 235 130 7 2 230 33 253 3e-27 114
    ACLAME|114327|GenBankID:3338444 l379747621refNC_016946.faa 36.17 235 130 7 2 230 33 253 3e-27 114
    ACLAME|114327|GenBankID:3338444 l387876282refNC_017904.faa 36.17 235 130 7 2 230 33 253 3e-27 114
    ACLAME|114327|GenBankID:3338444 l406031123refNC_018612.faa 36.17 235 130 7 2 230 33 253 3e-27 114
    ACLAME|114327|GenBankID:3338444 l157964124refNC_009900.faa 34.78 230 125 6 3 226 2 212 4e-27 113
    ACLAME|114327|GenBankID:3338444 l118465630refNC_008595.faa 36.17 235 130 7 2 230 33 253 5e-27 113
    ACLAME|114327|GenBankID:3338444 l383312062refNC_017028.faa 34.78 230 125 6 3 226 2 212 6e-27 112
    # BLASTP 2.2.26+
    # Query: ACLAME|114343|GenBankID:3338460
    # Database: ../db/20nov2012dbready
    # Fields: query id, subject id, % identity, alignment length, mismatches, gap opens, q. start, q. end, s. start, s. end, evalue, bit score
    # 251 hits found
    ACLAME|114343|GenBankID:3338460 l62184611refNC_006912.faa 100.00 870 0 0 1 870 1 870 0.0 1745
    ACLAME|114343|GenBankID:3338460 l408677840refNC_018750.faa 45.86 447 231 5 328 766 157 600 1e-97 329
    ACLAME|114343|GenBankID:3338460 l386846037refNC_017803.faa 31.52 276 175 9 400 666 181 451 3e-18 96.3
    ACLAME|114343|GenBankID:3338460 l119026047refNC_008618.faa 64.86 74 26 0 14 87 841 914 9e-17 92.4
    ACLAME|114343|GenBankID:3338460 l256825617refNC_013169.faa 60.24 83 33 0 19 101 871 953 1e-16 92.0
    ACLAME|114343|GenBankID:3338460 l117928708refNC_008578.faa 68.12 69 22 0 21 89 752 820 2e-16 91.7
    ACLAME|114343|GenBankID:3338460 l296269076refNC_014165.faa 65.22 69 24 0 19 87 770 838 2e-16 91.3
    ACLAME|114343|GenBankID:3338460 l386867279refNC_017834.faa 64.79 71 25 0 17 87 776 846 2e-16 91.3
    ACLAME|114343|GenBankID:3338460 l387821008refNC_017866.faa 64.79 71 25 0 17 87 805 875 2e-16 91.3
    ACLAME|114343|GenBankID:3338460 l387822686refNC_017867.faa 64.79 71 25 0 17 87 805 875 2e-16 91.3
    ACLAME|114343|GenBankID:3338460 l384194136refNC_017216.faa 64.79 71 25 0 17 87 805 875 2e-16 91.3
    ACLAME|114343|GenBankID:3338460 l384192542refNC_017215.faa 64.79 71 25 0 17 87 856 926 2e-16 91.3
    ACLAME|114343|GenBankID:3338460 l384191396refNC_017214.faa 64.79 71 25 0 17 87 856 926 2e-16 91.3
    ACLAME|114343|GenBankID:3338460 l219683414refNC_011835.faa 64.79 71 25 0 17 87 856 926 2e-16 91.3
    Je dois extraire les deux parties soulignées pour chaque ligne qui commence par ACLAME.

    Je rencontre plusieurs problèmes:
    -le premier est que je ne démarre pas à la première ligne (je commence à la 16ième)
    -je n'arrive pas à stocker sous forme de string ou de int la deuxième partie soulignée.
    -quand je fais des tests avec des couts pour vérifier ce que j'ai dans mes variables, on me met -1 pour la deuxième donnée
    -Avec les deux transformation de string en int, j'ai overtime sur la console.

    Je vous donne mon 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
    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
     
    #include <iostream>
    #include<string>
    #include<sstream>
    #include<fstream>
    using namespace std;
     
    int main()
     
    {
      ifstream recherche ("example.txt",ios::in);
     
      if (recherche)
      {
          string line;
          int proteine;
          int distance;
          while (getline(recherche,line))
          {
       string debut=line.substr(0,6);
     
               if (debut=="ACLAME")
     
                {
                    int possep1=line.find("l");
                    int possep2=line.find("ref",possep1+1);
                    int possep3=line.find('.',possep2+1);
                    int possep4=line.find('.',possep3+1);
                    int possep5=line.find("e"||'.',possep4+1);
     
                    string proteinestring=line.substr(possep1+1,possep2-(possep1+1));
                    istringstream(proteinestring)>>proteine;
     
     
                    string distancestring=line.substr(possep5-1,possep5+3);
                    istringstream(distancestring)>> distance;
     
             }
             else
             {
     
             }
          }
                   recherche.close();
     
      }
     
                   else
                   cerr <<"le fichier ne s'ouvre pas"<<endl;
     
                   return 0;
     
                }
    Merci

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    La méthode find de std::string renvoie un size_t, pas un int, commence par changer ça.

    -le premier est que je ne démarre pas à la première ligne (je commence à la 16ième)
    Ça commence à la 16e ligne ? Je vois pas trop pourquoi pour le coup...

    -je n'arrive pas à stocker sous forme de string ou de int la deuxième partie soulignée.
    Un petit parsing devrait résoudre ton problème. Pour ça tu devrais utiliser la classe istringstream. J'ai posté un code source facilitant son utilisation qui permet aussi de faire un peu de parsing. Jettes-y un coup d'oeil si ça te tente pour voir comment je m'y suis pris.

    EDIT: ou alors d'utiliser les regexp comme l'a proposé cob59 (ce qui me semble une bien meilleure idée).

    -quand je fais des tests avec des couts pour vérifier ce que j'ai dans mes variables, on me met -1 pour la deuxième donnée
    Utilise des size_t et regarde l'exemple fourni dans la doc que je t'ai donné au début pour la méthode find.

    -Avec les deux transformation de string en int, j'ai overtime sur la console.
    Je t'avoue que j'ignore de quoi il s'agit...

    En espérant t'avoir aidé.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Ca vaudrait peut-être le coup d'utiliser des expressions régulières ?

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2013
    Messages : 2
    Par défaut
    Merci de vos réponses, je vais tester tout ça.

Discussions similaires

  1. [Système] Extraire des données d'une page web
    Par nazoreen dans le forum Langage
    Réponses: 17
    Dernier message: 22/03/2006, 21h38
  2. Extraire des donnés d'un fichier texte
    Par sadsad dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2006, 15h09
  3. Réponses: 7
    Dernier message: 29/09/2005, 10h19
  4. Réponses: 1
    Dernier message: 28/09/2005, 15h35
  5. extraire des données d'un code HTML
    Par blueice dans le forum Langage
    Réponses: 5
    Dernier message: 19/08/2004, 19h41

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