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

Entrée/Sortie Java Discussion :

Pb de parsage de fichier texte


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Pb de parsage de fichier texte
    Bonjour à tout le monde,

    Je suis nouvelle sur le forum tout comme en java et j'espère que vous serez indulgents envers moi. Cela fait 2 jours que je cherche désespérément à régler un petit problème.
    J'ai un fichier texte dont les informations (sur des séquences protéiques) sont séparées par une tabulation. Le problème est que pour chaque séquence, la ligne qui contient ces informations se prolonge sur 2, 3 voire 4 lignes avant de passer à la séquence suivante (tout en conservant la tabulation comme délimiteur).
    Donc je parviens à récupérer facilement les informations de la 1ère ligne de chaque séquence mais pas les autres lignes qui suivent

    Voici comment se présente mon fichier texte :

    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
    1        imgtligm_A03900_A03900_H.sapiens_HuV(NP)_gene____u        productive        IGHV4-39*07, or IGHV4-4*07 or IGHV4-59*04 or IGHV4-59*05 or IGHV4-b*02 (see comment)        619        68.77        196/285 nt 
    IGHJ4*03        195        89.58        43/48 nt        IGHD3-22*01        2        8        8        13        8.8.13        [25.17.38.11] CARYDYYGSSYFDYW        in-frame +  The submitted sequence and the 
    closest germline V-GENE allele show different CDR1-IMGT amino acid lengths (8 
    AA in imgtligm_A03900_A03900_H.sapiens_HuV(NP)_gene____u ; 10 AA in  IGHV4-39*07), different CDR2-IMGT amino acid lengths (8 AA in imgtligm_A03900_A03900_H.sapiens_HuV(NP)_gene____u ;  7 AA in  IGHV4-39*07), and low V-REGION identity (68.77% )        
    atgcaaatcctctgaatctacatggtaaatataggtttgtctataccacaaacagaaaaacatgagatcacagttctctctacagttactgagcacacaggacctcaccatgggatggagctgtatcatcctcttcttggtagcaacagctacaggtaaggggctcacagtagcaggcttgaggtctggacatatatatgggtgacaatgacatccactttgcctttctctccacaggtgtccactcccaggtccaactgcaggagagcggtccaggtcttgtgagacctagccagaccctgagcctgacctgcaccgtgtctggcagcaccttcagcagctactggatgcactgggtgagacagccacctggacgaggtcttgagtggattggaaggattgatcctaatagtggtggtactaagtacaatgagaagttcaagagcagagtgacaatgctggtagacaccagcaagaaccagttcagcctgagactcagcagcgtgacagccgccgacaccgcggtctattattgtgcaagatacgattactacggtagtagctactttgactactggggtcaaggcagcctcgtcacagtctcctcaggt        
    2        imgtligm_A03907_A03907_H.sapiens_antibody_D1.3_var        productive        IGHV2-5*08, or IGHV2-70*01 (see comment)        628        69.12        197/285 nt        
    IGHJ4*01        136        76.6        36/47 nt        IGHD3-10*01        2        8        7        10        8.7.10        [25.17.38.11]        CARERDYRLDYW        in-frame        
    +                The submitted sequence and the closest germline V-GENE allele show different CDR1-IMGT amino acid lengths (8 AA in 
    imgtligm_A03907_A03907_H.sapiens_antibody_D1.3_var ; 10 AA in  IGHV2-5*08), and low V-REGION identity (69.12% )        
            tcagagcatggctgtcctggcattactcttctgcctggtaacattcccaagctgtatcctttcccaggtgcagctgaaggagtcaggacctggcctggtggcgccctcacagagcctgtccatcacatgcaccgtctcagggttctcattaaccggctatggtgtaaactgggttcgccagcctccaggaaagggtctggagtggctgggaatgatttggggtgatggaaacacagactataattcagctctcaaatccagactgagcatcagcaaggacaactccaagagccaagttttcttaaaaatgaacagtctgcacactgatgacacagccaggtactactgtgccagagagagagattataggcttgactactggggccaaggcaccactctcacagtctcctca        
    3        imgtligm_A18395_A18395_Human_uPA_cDNA____unassigne        productive        IGHV2-5*08 (see comment)        524        65.14        185/284 nt        IGHJ4*01        
    159        81.25        39/48 nt        IGHD2-15*01        2        8        7        11        8.7.11        [24.17.38.11]        CARNYWGTSMDYW        in-frame        +                The submitted 
    sequence and the closest germline V-GENE allele show different CDR1-IMGT amino acid lengths (8 AA in imgtligm_A18395_A18395_Human_uPA_cDNA____unassigne ; 10 AA in  
    IGHV2-5*08), and low V-REGION identity (65.14% )                
    ctgcaggaatgaagcagtcaggacctggcctagtgcagccctcacagagcctgtccatcacctgcacagtctctggtttctcattaactacctatggtgtacactggattcgccagtctccaggaaagggtctggagtggctgggagtgatatggagtggtggaagcacagactataatgcagctttcatatccagactgagcatcaacaaggacaattccaagagccaagttttctttaaaatgaacagtctgcaagctaatgacacagccatatattactgtgccagaaattattggggaacctctatggactactggggtcaaggaacctcagtcaccgtctcctcagccaaaacgacacccccatctgtctatccactggaattcgatatcaagctt        
    4        imgtligm_A25486_A25486_H.sapiens_mRNA_for_T-cell_r        No results        
    5        imgtligm_A25487_A25487_H.sapiens_mRNA_for_T-cell_r        No results        
    6        imgtligm_A25488_A25488_H.sapiens_mRNA_for_T-cell_r        No results        
    7        imgtligm_A25489_A25489_H.sapiens_mRNA_for_T-cell_r        No results        
    8        imgtligm_A25490_A25490_H.sapiens_mRNA_for_T-cell_r        No results        
    9        imgtligm_A25491_A25491_H.sapiens_mRNA_for_T-cell_r        unknown (see comment)        IGLV4-3*01        6        44.79        86/192 nt                                                        1        7        X        1.7.X        [X.17.36.X]                null        +        No rearrangement found                        actgtgtcctggtaccaacaggccctgggtcaggggccccagtttatctttcagtattatagggaggaagagaatggcagaggaaactcccctcctagattctcaggtctccagttccct

    Et voici une partie du code que j'ai développé pour le moment (je ne vous mets que l'essentiel):

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    public class Parser
    {
        public static void main(String[] args) throws IOException
        {    	
           FileReader fr = new FileReader("Summary.txt");
           BufferedReader br = new BufferedReader(fr);
     
           String ligne = "";        
     
           while (( ligne = br.readLine())!= null)
           {
               String s=ligne.trim();
        	  //On "explose" la phrase selon une tabulation
              String[] data = s.split("\\t", 23);	
     
        	  //Si la ligne commence par un chiffre, on fait les traitements 
              Pattern pattern = Pattern.compile("[0-9]+");
              Matcher matcher = pattern.matcher(data[0]);
              while (matcher.find())
        	  {  
     
              //On récupère l'id de la séquence
              String[] idSequence = data[1].split("_");
              System.out.println ("\n" + idSequence[1]);
     
              //On vérifie qu'il y ait bien des allèle V (data[3] non vide)
              if (data.length > 4)
              {	  
              //On récupère les noms des allèle V les uns après les autres
              String[] nomV = data[3].split ("or");     
     
              //On récupère le nom du gène correspondant pour le 1er d'abord 
              String[] geneV = nomV[0].split("\\*");          
     
              //Si le 1er allèle V se termine par un "(see comment)", on l'enlève
              if (nomV[0].indexOf("(see comment)") > 0)
              {System.out.println(geneV[0] + "    " + nomV[0].substring (0,11));} 
     
              //S'il se termine par une virgule, on l'enlève
              else 
            	  { 
            	   if (nomV[0].indexOf(",") > 0)
                         {
            	     String[] nomV1 = nomV[0].split(","); 
            	     System.out.println(geneV[0] + "    " + nomV1[0]);
            	     }
     
                        else { System.out.println (geneV[0] + "    " + nomV[0]);}
            	  }
     
     
              //On affiche les autres allèles V
              for (int i=1; i<nomV.length-1;i++)
              {   
                  //On récupère le nom du gène correspondant pour les autres allèles
                  String[] geneVi = nomV[i].split("\\*");    
     
                  System.out.println(geneVi[0] + "    " + nomV[i]); 
              }
     
              //On vérifie si le dernier allèle V contient le "(see comment)"
              String lastOneV = nomV[nomV.length-1];
     
        	  //On récupère le nom du gène correspondant pour le dernier allèle 
              String[] geneVlast = lastOneV.split("\\*");     
     
              //Si c'est le cas, on enlève le "(see comment)"
              if (lastOneV.indexOf("(see comment)") > 0 && nomV.length > 1)
              {System.out.println(geneVlast[0] + "    " + lastOneV.substring (0,12));}
     
              //Sinon, on affiche l'allèle V tel qu'il est seulement s'il y a plus de 1 allèle (pour ne pas répéter les mêmes allèles)
              else if (nomV.length > 1) 
              { System.out.println(geneVlast[0] + "    " + lastOneV);}  
     
              } // fin du if (data.length > 4)
     
              } // fin du second while                             
     
           } //fin du 1er while   
     
    	  //On ferme le fichier 
    	  br.close();
     
         } // fin de la méthode static		
     
    } // fin de la classe

    Voilà et donc pour récapituler, je regarde si la ligne commence par un chiffre. Je fais un split avec comme délimiteur une tabulation et comme limite 23. Je récupère ce qui m'intéresse.
    Mais le problème, je ne récupère les données que de la 1ère ligne pour chaque numéro de séquence, je n'arrive pas à récupérer les lignes qui suivent jusqu'à la prochaine séquence, sachant que c'est une seule et même ligne en fait mais coupée en plusieurs lignes (car elle est trop longue).
    En php, c'est très facile, dés que je fais un split, il me récupère toute la ligne jusqu'à la prochaine séquence (sans tenir compte de sa longueur, tant que c'est la même avec comme délimiteur la tabulation) mais en java, il s'arrête dès la fin de la 1ère ligne

    J'ai pensé à enlever les sauts de lignes à l'intérieur des lignes de chaque séquence, mais ça ne marche pas, le fichier reste tel quel

    J'espère que c'est assez clair et merci à toute âme généreuse qui pourra m'aider.

    Bien amicalement.

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Je ne suis pas sur d'avoir compris, mais si le problème n'est que la coupure de tes lignes en plusieurs, ne parse pas le fichier par ligne
    ( dans ton code : "while (( ligne = br.readLine())!= null)" : la fonction "readLine" te ramène les caractères avant le saut de ligne )
    mets plutôt tout dans un tampon de type StringBuffer jusqu'au "vrai" saut de ligne (si tu sais le déterminer), puis fais ton traitement.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Bonjour redguts et merci pour ta réponse.

    Oui c'est exactement mon problème. Chacune de mes lignes se composent de plusieurs lignes et justement je ne voulais pas faire de lecture ligne par ligne mais ne connaissant pas encore tous les outils java, je n'ai pas su faire une lecture en bloc jusqu'à la bonne "fin de ligne". Comment fais-tu le StringBuffer stp? Pour le moment je suis en train d'enregistrer chacune de mes lignes dans un vecteur que je vais lire par la suite. Est-ce une bonne idée à ton avis? En tout cas, j'ai réussi à tout mettre en liste, je vais voir si ça marche.

    Merci encore.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    Bonjour je n'ai pas encore trop réfléchit à la solution mais voila j'ai lu une ligne qui me semble être une erreur


    //Si la ligne commence par un chiffre, on fait les traitements
    Pattern pattern = Pattern.compile("[0-9]+");
    or dans ton fichier exemple on note une erreur car juste après la ligne 3 il y a une ligne qui commence par 159 or ce n'est pas une nouvelle ligne

    la question qu'il faut que tu te pause c'est comment savoir que l'on a a faire a une ligne complet ou juste a un retour a la ligne ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Bonjour rolfone,

    En effet c'est une très judicieuse remarque que j'ai déjà réglé en fait. J'ai posté l'ancienne version du code, j'en suis désolée, faute d'inattention. Chaque nouvelle ligne est caractérisée comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "[0-9]+\timgtligm_(.*)"
    Soit un nombre plus une tabulation plus le logo du labo.
    Grâce à cette expression régulière, je reconnais bien chaque nouvelle ligne.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    alors dans ce cas la voila comment je ferais pour me simplifier la vie en 1er temps je reconstituerais les lignes

    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
            BufferedReader br = new BufferedReader(new FileReader("mon fichier"));
     
            String tmp_Ligne = null;
            StringBuilder sb = new StringBuilder();
            List<String> fileParse = new ArrayList<String>();
     
            while ((tmp_Ligne = br.readLine()) != null) {
                if (!tmp_Ligne.startsWith("[0-9]+\timgtligm_(.*)")) {
                    sb.append(tmp_Ligne);
                }else{
                    fileParse.add(sb.toString());
                    sb.setLength(0);
                }
            }
            // pour la derrnier ligne
            fileParse.add(sb.toString());
    et voir même si cela est possible je me ferais un classe qui représente ce que tu définie dans ta ligne (séquences protéiques) avec tout les attribute que tu a besoin. comme cela apres tu te retrouve avec une List<séquencesProtéiques> et le traitement sera plus simple

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Merci infiniment très cher, ça marche impeccable

    Bien amicalement.

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

Discussions similaires

  1. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57
  2. Réponses: 1
    Dernier message: 12/02/2003, 09h36
  3. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54
  4. Importer des fichiers textes délimités
    Par Invité dans le forum Outils
    Réponses: 2
    Dernier message: 23/09/2002, 13h56
  5. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17

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