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

Bioinformatique Perl Discussion :

problème parser fichier


Sujet :

Bioinformatique Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut problème parser fichier
    Bonjour,

    j'ai un souci de parsage


    Voiçi le type de fichier que j'ai (séparation par tabulation)
    essai1 gene transcript 2048 2134 S00000002001
    essai1 gene seq 2048 2049 S00000002001
    essai1 gene seq 2056 2065 S00000002001
    essai1 gene seq 2103 2134 S00000002001

    J'aimerais avoir au final (7 champs)

    S00000002001 essai 2048 2134 3 2048,2056,2103 2049,2065,2134

    champ 5 indique le nombre de ligne pour lequel on a seq (en champ3)
    champ6 indique position initiales correspondant séparé par des virgules
    champ6 indique position finales correspondant séparé par des virgules


    Mon problème est au niveau de l'obtention du champ 7. En effet,
    j'obtiens 2134,2049,2065,2134 et je n'arrive pas à voir ou se situe ma faute.

    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
     
    my @tab=();
    my $nb=0;
    my $nb_cds=0;
    my $debut;
    my $fin;
     
    while( my $ligne=<ALL>){
        if($ligne =~ /(.+)\tgene\ttranscript\t([0-9]+)\t([0-9]+)\t(.+)$/){
    	$nb++;
    	$tab[$nb][1]=$6;
    	$tab[$nb][2]=$1;
    	$tab[$nb][3]=$2;
    	$tab[$nb][4]=$3;
     
    	$debut=$2;
     
    	$fin=$3;
    	$nb_cds=0;
        }
        elsif($ligne =~ /(.+)\tfgenesh\tseq\t([0-9]+)\t([0-9]+)\t(.+)$/){
    	$nb_cds++;
     
    	$tab[$nb][5]=$nb_cds;
     
    	if($debut eq $2){ 
    	    $debut=$2;
    	    $tab[$nb][6]=$debut;
    	} 
    	else{
    	    $debut=$debut .",".$2; 
    	    $tab[$nb][6]=$debut;
    	}
    	if($fin eq $3){ 
    	    $fin=$3;
    	    $tab[$nb][7]=$fin;
    	} 
    	else{
    	    $fin=$fin .",".$3; 
    	    $tab[$nb][7]=$fin;
    	}
    }
     
    for(my $i=1; $i<=$nb; $i++){
      print("$tab[$i][1]\t$tab[$i][2]\t$tab[$i][3]\t$tab[$i][4]\t$tab[$i][5]\t$tab[$i][4]\t$tab[$i][5]\t$tab[$i][6]\t$tab[$i][7]\n");
    }
    print("\n\n\n");

    Pourrait-on m'aider, svp
    merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    Une autre question qui pourrait m'aider:

    Soit un tableau, comment supprimer le premier élement de celui-ci (il s'agit d'un tableau de chiffre et non de caractère!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(my $j=1; $j<=$nombre; $j++){
        print("$tableau[$j][1]\n"); // m'affiche 2134,2049,2065,2134
    }

    j'ai ceci:
    2134,2049,2065,2134
    et je voudrais ceci:
    2049,2065,2134

    merci par avance

  3. #3
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Pas facile à exploiter ton code :
    - fautes dans la regex suivante (un f et un h qui se balade) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (.+)\tfgenesh\tseq\t([0-9]+)\t([0-9]+)\t(.+)$/ :
    - boucle while non fermée
    - variable $6 à la place de $4 dans ton premier if
    - print qui affiche des valeurs plusieurs fois etc.

    Mais bon en corrigeant ton deuxième if tu peux obtenir ce que tu veux. Le problème était que la variable fin qui prend une valeur dans ta première boucle (donc ligne contenant transcript), tu la concaténais dans ta deuxième avec ton else :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    else{
    	    $fin=$fin .",".$3; 
    	    $tab[$nb][7]=$fin;
    	}
    d'où ton 2134 en trop.

    Voici ton code un peu corrigé où je teste juste dans le deuxième if si la valeur du tableau existe, auquel cas je concatène avec une virgule, sinon on met la valeur tout de suite. Il n'y a donc pas de vérification de début et de fin... A toi de voir si cela est important ou non :
    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
     
    my @tab=();
    my $nb=0;
    my $nb_cds=0;
    my $debut;
    my $fin;
     
    while( my $ligne=<ALL>){
      chomp($ligne);
      if($ligne =~ /(.+)\tgene\ttranscript\t([0-9]+)\t([0-9]+)\t(.+)/){
        $nb++;
        $tab[$nb][1]=$4;
        $tab[$nb][2]=$1;
        $tab[$nb][3]=$2;
        $tab[$nb][4]=$3;
     
        $debut=$2;
        $fin=$3;
        $nb_cds=0;
      }
      elsif($ligne =~ /(.+)\tgene\tseq\t([0-9]+)\t([0-9]+)\t(.+)$/){
        $nb_cds++;
     
        $tab[$nb][5]=$nb_cds;
     
        if($tab[$nb][6]){
          $tab[$nb][6] .= ",$2";
        }
        else{
          $tab[$nb][6] .= "$2";
        }
        if($tab[$nb][7]){
          $tab[$nb][7] .= ",$3";
        }
        else{
          $tab[$nb][7] = $3;
        }
     
      }
    }
    close(ALL);
     
     
    for(my $i=1; $i<=$nb; $i++){
      print("$tab[$i][1]\t$tab[$i][2]\t$tab[$i][3]\t$tab[$i][4]\t$tab[$i][5]\t$tab[$i][6]\t$tab[$i][7]\n");
    }
     
    print("\n\n\n");
    Mais que donne ton code sur un fichier contenant plusieurs lignes ... ?

    Pour finir, je dirais que tu devrais plus utiliser des fonctions comme push pour remplir des tableaux (en perl le premier indice d'un tableau est 0 et non 1), utiliser des hash pour conserver tes infos surtout si tu dois matcher des lignes entre elles suivant une clé (par exemple ton S00000002001 ou ton essai1) etc. ce qui amenrait de la robustesse dans ton code et de la lisibilité ...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    Merci Beniou. j'ai dû mal avec les hash...
    le code fonctionne avec plusieurs ligne

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

Discussions similaires

  1. [Delphi 3] Problème avec fichier ressource .RES
    Par delphim dans le forum EDI
    Réponses: 2
    Dernier message: 28/06/2005, 18h11
  2. [Servlet] Probléme écriture fichier
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/05/2005, 15h17
  3. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36
  4. Problème ouverture fichier par double clic...
    Par sankookai dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2005, 09h13
  5. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17

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