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

Langage Perl Discussion :

Extraction de colonnes à partir d'un fichier text


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut Extraction de colonnes à partir d'un fichier text
    Salut,
    voila le pb: j'ai un fichier (n ligneX m colonne)
    je voudrai récupérer chaque colonne , faire un calcul dessu, l'enregistrer et passer à la suivante

    a la fin, afficher toutes les colonnes,

    merci d'avance si vous avez des idées

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    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
    open my $file, '<', 'chemin' or die $!;
     
    # array de array $tab[col][val]
    my @tab;
     
    while (my $line = <$file>){
     
    	if ( $line =~ m//){
     
    		# récupération des valeurs	
                    $tab[$.] = \($1, $2, $3, $4 ...);
    	}
     
    }	
     
    close $file;
     
    # calculs sur @tab (indices de 1 à $#tab)
    Utilise une expression régulière afin de récupérer tes valeurs
    Tu peux utiliser un array de array stockant tes valeurs pour ensuite travailler par colonne
    -- Jasmine --

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    si j'ai bien compris le (while) il permet une lecture horizontale (une à une)
    mon pb c'est que j'aimerai récupéer toute la colonne (colonne i, ligne (1...m))
    puis faire les calculs.

    Merci pour ton message

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par karimDevelopper Voir le message
    si j'ai bien compris le (while) il permet une lecture horizontale (une à une)
    mon pb c'est que j'aimerai récupéer toute la colonne (colonne i, ligne (1...m))
    puis faire les calculs.

    Merci pour ton message
    Tu ne peux pas lire ton fichier autrement ... sauf un fichier excel peut-être
    -- Jasmine --

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	if ( $line =~ m//){
     
    		# récupération des valeurs	
                    push @{$tab{'col1'}, $1;
    		 push @{$tab{'col2'}}, $2;
    		 ...
    	}
    Utilise une structure ainsi un hash de array qui se déclare my %tab.
    -- Jasmine --

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Je pensais que le perl permettait une lecture verticale des fichiers...

    autre chose: est ce qu'on peux lire une colonne dans un tab à 2D sans une boucle
    exemple: tab[.,1]: : première colonne

    merci

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Où est le rapport avec la bioinformatique? Quel type de fichier est-ce?
    -- Jasmine --

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Le code doit ressembler à quelque chose de ce genre
    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
    open my $file, '<', 'chemin' or die $!;
     
    # hash de array $tab{col1}[val1a, val1b...]
    my %tab;
     
    while (my $line = <$file>){
     
    	if ( $line =~ m//){
     
    		# récupération des valeurs	
                    push @{$tab['col1']}, $1;
    		push @{$tab['col2']}, $2;
    	}
     
    }	
     
    close $file;
     
     
    # calculs 
    foreach my $k (sort $key %tab){
     
    	# boucle sur les valeurs de la colonne $k
    	foreach my $v ( @{$tab{$k}} ){
     
    	}
     
    	# colonne $k valeur de la première ligne
    	$tab{$k}->[1];
     
    	# colonne $k valeur de la deuxième ligne
    	$tab{$k}->[2];
    }
    -- Jasmine --

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    je traite des fichiers de génotypage, je voudrai calculer pour chaque snp(colonne) des fréquence (allele),
    Je sais le faire sous shell (sed + awk), le pb, ca prend bq de temps
    je cherche à lire le fichier verticalement, je pense que les calculs seront plus rapide

    plus exactement, je chercher l'equivalent du "cut" en shell sur perl
    voila, jasmine. et merci d'avance
    si t'as des idées

  10. #10
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    C'est mieux de prendre un array de array ... mon idée de prendre un hash est stupide

    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
    open my $file, '<', 'chemin' or die $!;
     
    # array de array $tab[num col][val1a, val1b...]
    # $tab[col][line]
    my @tab;
     
    while (my $line = <$file>){
     
    	if ( $line =~ m//){
     
    		# récupération des valeurs pour 4 colonnes	
                   push @{$tab[0]}, $1;
    		push @{$tab[1]}, $2;
    		push @{$tab[2]}, $3;
    		push @{$tab[3]}, $4;
    	}
     
    }	
     
    close $file;
     
     
    # calculs 
    foreach my $col (0..3)
     
    	# boucle sur les valeurs de la colonne $col
    	foreach my $v ( @{$tab[$col]} ){
     
    	}
     
    	# colonne $col valeur de la première ligne
    	$tab[$col]->[0];
     
    	# colonne $col valeur de la deuxième ligne
    	$tab[$col]->[1];
    }
    Si ton délimiteur de valeurs est constant, tu peux te passer d'expression régulière et faire un split sur $line pour récupérer tes différentes valeurs.
    -- Jasmine --

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Peux tu mettre un exemple de lignes ?
    Quelle est la taille de ton fichier ?
    Quel est le séparateur de tes colonnes ? une tabulation ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut Exemple
    fichier (500 x 10^6)
    séparateur \t
    exemple:
    ID rs1 rs2 rs5 rs3
    339 0 0 0 0 0 0 0 0
    340 0 0 0 0 0 0 0 0
    341 0 0 0 0 0 0 0 0
    342 0 0 0 0 0 0 0 0

    le souci: j'aimerai traiter verticalement avec le moins de commande possible (lecture verticale, ) pour minimiser le temps

    ps.pour jasmine, (merci pour ton deuxième code (array de array, il est bien visible pour moi)

  13. #13
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tu peux faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while (my $line = <$file>){
     
    	chomp $line;
     
    	my ($ID, $rs1, $rs2, $rs5, $rs3) = split /\t/, $line;
     
    	push @{$tab[0]}, $ID;
    	push @{$tab[1]}, $rs1;
    	push @{$tab[2]}, $rs2;
    	push @{$tab[3]}, $rs5;
    	push @{$tab[4]}, $rs3;
     
    }


    EDIT : erreur sur le split
    -- Jasmine --

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    La taille en octet de ton fichier ? C'est histoire de savoir si on peut le charger en mémoire ?

    le souci: j'aimerai traiter verticalement avec le moins de commande possible (lecture verticale, ) pour minimiser le temps
    Ce n'est pas un argument ça. Le moins de code ne veut pas dire plus rapide, c'est une ineptie de penser ainsi. Le moins de code veut généralement dire code incompréhensible, illisible et non maintenable pour un non initié.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Merci jasmine
    ta solution me va bien
    ++

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut pour jibril
    quand je dis le moins de code, je comprends, le moins d'opérations,
    ex:
    prendre une ligne, la découper, séléctionner la première valeur, la deuxième...
    faire de meme pour le deuxièmre ligne et faire la somme


    je chercher à lire mon fichier verticalement, un genre de "cut" en shell


    merci jibril

  17. #17
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Tu n'as toujours pas répondu à ma question par rapport à la taille de ton fichier.
    La solution de jasmine est correct car tout est mis en mémoire et ce sera rapide. Mais à la seule condition que tout puisse tenir en mémoire, car si tu as un fichier de 10 Go, tu auras des soucis.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    le fichier fait 770 mo.
    j'ai remarqué qu'il ya certaines commandes qui consomment plus de temps que d'autres.
    en shell, le parse total prend des heures,,,,
    Est ce vrai ou plutot sur quoi dois je me baser pour avoir un code qui tourne vite...

    merci jibril

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/07/2020, 19h50
  2. [DATA] Extraction de données à partir d'un fichier Texte
    Par bounekkar dans le forum SAS Base
    Réponses: 3
    Dernier message: 16/04/2012, 21h30
  3. Extraction d'un bloc de données a partir d'un fichier texte
    Par new123 dans le forum Général Java
    Réponses: 1
    Dernier message: 14/05/2010, 11h55
  4. Extraction d'un numéro a partir d'un fichier texte
    Par souminet dans le forum Langage
    Réponses: 9
    Dernier message: 05/04/2010, 11h32
  5. extraction de données à partir d'un fichier text ou xml
    Par bigplayer dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2007, 17h13

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