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 :

Récupération valeur colonne, application commande [Débutant(e)]


Sujet :

Langage Perl

  1. #1
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut Récupération valeur colonne, application commande
    Bonjour,

    Alors voilà, je rencontre un petit souci. En effet, voici un exemple de mon fichier à traiter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    chr01   1045    1059    1
    chr01   2820    2898    2
    chr01   2840    2900    2
    chr01   2900    3000    2
    chr01   3000    3898    2
    chr01   20836   20838   3
    chr01   23314   23323   4
    Je souhaite, selon les valeurs de la quatrième colonne, récupérer les lignes dans un autre fichier.
    En gros, pour le 1, bah j'ai qu'une ligne, hop, dans un nouveau fichier.
    Pour le 2, j'ai 4 lignes, hop, elles se retrouvent dans un autre fichier.

    Auriez-vous un conseil à me donner ? Une piste ?
    Au début, étant partisane du moindre effort, j'ai voulu partir sur quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -w -F'\t' -ane 'print if sprintf ("%u", $F[3]) == 2' > nouveauFichier
    Sauf que ça m'oblige à taper à chaque fois la valeur... Sachant que ça va à peu près jusque 600 et que ce n'est pas linéaire (en gros, il peut manger les 11, 14, 200, etc). Je pense donc être obligée de faire un script et... Je vous remercie d'avance pour vos conseils !

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    c'est selon la valeur de la dernière colonne que tu veux faire la ventilation, ou selon le nombre de fois où cette valeur apparaît?
    Deuxième question: est-ce que tes fichier en sortie peuvent tous avoir le même nom avec juste un numéro qui change?

    J'ai une bonne idée de comment faire, mais j'aimerais avoir d'abord les réponses à ces questions pour être sûr que ça corresponde à tes besoins.

  3. #3
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Je ne comprends pas trop le terme de ventilation, mais je veux bien regrouper mes lignes selon le numéro de la quatrième colonne. Tous les 2 ensemble, tous les 4 ensemble, etc.
    Pour le titre, le mieux serait qu'on retrouve le numéro en question. Genre si on regroupe tous les 2, voir le 2 dans le titre, tous les 123, voir 123 dans le titre, etc.
    Je ne sais pas si je suis très claire :S

    Mais merci d'avance pour ton aide !

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Ventilation, c'est dans ce cas un autre mot pour répartition.

    Ton besoin est maintenant bien clair, je te prépare un pour de code et reviens.

  5. #5
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Ok super !
    Je te montre ce que j'ai essayé ce matin qui est assez nul mais bon xD
    Voici le script :
    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
    #!/ usr/bin/env perl
     
    use strict;
     
    if ($#ARGV != 1)
    {
        die "\n\tUsage : nbSupport FileName\n\n";
    }
     
    my $support = $ARGV[0]; open C, "<$ARGV[1]" or die "Impossible ouvrir le fichier de cluster";
    while (my $ligne = <C>) 
    {
        my @tab = split /\s/, $ligne; 
        if ($support==$tab[3])
        {
            print $ligne;
        }
    }
     
    close C;
    Et je le lançais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in `seq 1 156`; do perl /home/lhelou/script/scriptPerl/countCouv.pl $i > bedParCouv/sup$i.bed; done
    Un des problèmes, en plus de ne pas être très intelligent, hum, c'est que ça m'a créé pleiiins de fichiers vides, et que c'est pas facile du tout de s'y retrouver.
    Vu qu'il me le lançait pour des valeurs de 1 à 156 sans savoir si par exemple le 5 existait ou non.
    Je sais pas si je suis claire...
    En tout cas, merci d'avance !

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Re-bonjour,

    voici un script qui ne crée que les fichiers nécessaires (pas de fichiers vides).

    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
     
    use strict;
    use warnings;
     
    my %FH; # hachage de file handles
     
    while (my $line = <DATA>) {
    	chomp $line;
    	my $id = $1 if $line =~ /(\d+)$/;
    	create_file($id) unless exists $FH{$id};  # ouverture du fichier s'il n'existe pas
    	print {$FH{$id}} "$line\n";
    }
    close $_ for values %FH;
     
    sub create_file {
    	my $id = shift;
    	my $file_out = "resultat_$id.txt";
    	open my $FH_OUT, ">", $file_out or die "Ouverture impossible de $file_out $!";
    	$FH{$id} = $FH_OUT;
    }
     
    __DATA__
    chr01   1045    1059    1
    chr01   2820    2898    2
    chr01   2840    2900    2
    chr01   2900    3000    2
    chr01   3000    3898    2
    chr01   20836   20838   3
    chr01   23314   23323   4
    chr01   23315   23325 600
    Les données utilisées pour le test sont dans la section __DATA__ à la fin du script. Tu dois remplacer par l'ouverture de ton vrai fichier en entrée.

    Ce script me crée les fichiers suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ls -lrt res*
    -rw-r--r-- 1 prod dqd  26 2016-05-18 10:42 resultat_3.txt
    -rw-r--r-- 1 prod dqd 104 2016-05-18 10:42 resultat_2.txt
    -rw-r--r-- 1 prod dqd  26 2016-05-18 10:42 resultat_1.txt
    -rw-r--r-- 1 prod dqd  26 2016-05-18 10:42 resultat_600.txt
    -rw-r--r-- 1 prod dqd  26 2016-05-18 10:42 resultat_4.txt
    Et les fichiers contiennent bien les données attendues. Par exemple resultat2.txt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $cat resultat_2.txt
    chr01   2820    2898    2
    chr01   2840    2900    2
    chr01   2900    3000    2
    chr01   3000    3898    2
    A ta disposition pour expliquer ce que tu ne comprendrais pas bien.

    Bonne journée,
    Laurent.

  7. #7
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Ouaouuu !
    C'est super, ça marche nickel ! Merci beaucoup !!
    Par contre, ayant débuté perl il n'y a qu'un tout petit mois et ayant appris les tables de hachage un peu dans la foulée, j'aurai quelques questions en effet, si ça ne t'ennuie pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	my $id = $1 if $ligne =~ /(\d+)$/;
    Je comprends pas trop le my $id = $1
    Si j'ai bien compris, on affecte ce $1 à $id si notre ligne se termine par des chiffres, ça ok.
    Mais le $1... Comment on sait qu'il correspond à la quatrième colonne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	print {$FH{$id}} "$ligne\n";
    Là on print dans le fichier la ligne ?
    J'ai un pitit peu de mal à comprendre la manipulation du $id ^^'

    Le shift permet de passer d'un "chiffre" à l'autre c'est ça ? C'est pour ça qu'on peut avoir 1, 2, 3... 510 ?
    Sans passer pour une boucle for (my $i=0; $i<520; $i++) par exemple ?

    Désolée si je pose beaucoup de questions mais je n'aime pas utiliser quelque chose que je ne comprends pas parfaitement
    Encore merci !

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par FryHandiz Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	my $id = $1 if $ligne =~ /(\d+)$/;
    Je comprends pas trop le my $id = $1
    Si j'ai bien compris, on affecte ce $1 à $id si notre ligne se termine par des chiffres, ça ok.
    Mais le $1... Comment on sait qu'il correspond à la quatrième colonne ?
    /(\d+)$/ est une expression régulière qui recherche un groupe de chiffres consécutifs (au moins un chiffre, mais autant qu'il y en a s'il y en a plusieurs de suite) à la fin de la ligne ($ = fin de ligne). Les parenthèses servent à capturer ces chiffres qui sont stockés dans $1 (s'il y a plusieurs paires de parenthèses dans l'expression régulière, les captures aboutiront dans $1, $2, etc.). Ici, je récupère le groupe de chiffres à la fin de la ligne.

    Citation Envoyé par FryHandiz Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	print {$FH{$id}} "$ligne\n";
    Là on print dans le fichier la ligne ?
    J'ai un pitit peu de mal à comprendre la manipulation du $id ^^'
    J'ai stocké les différents file handles dans le hachage %FH. J'écris donc la ligne courante dans le file handle correspondant à l'id trouvé.

    Citation Envoyé par FryHandiz Voir le message
    Le shift permet de passer d'un "chiffre" à l'autre c'est ça ? C'est pour ça qu'on peut avoir 1, 2, 3... 510 ?
    Sans passer pour une boucle for (my $i=0; $i<520; $i++) par exemple ?
    Le shift sert à récupérer la valeur reçue en paramètre par la fonction. Quand on appelle une fonction, les paramètres sont stockés dans le tableau @_. La fonction shift retire et récupère le premier élément d'un tableau. Dans une fonction, si l'on ne précise pas le tableau sur lequel porte le shift, il agit par défaut sur @_. Donc, le shift récupère le premier paramètre passé à la fonction ($id).

  9. #9
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    D'accord, je comprends beaucoup mieux, merci beaucoup !
    Cependant, encore une petite question ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    close $_ for values %IF;
    ça sert à quoi...? Si on ne ferme pas, ça fait quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	open my $FH_OUT, ">", $file_out or die "Ouverture impossible de $file_out $!";
    	$FH{$id} = $FH_OUT;
    Donc ici, on "écrit" dans $file_out si je ne dis pas de bêtises ?
    Puis la ligne d'après, on affecte l'indicateur de fichier pour un certain id ($FH{id}) à notre variable $FH_OUT ?
    Ou alors c'est plutôt l'inverse ? En fait, je suis certainement débile mais j'aurai plutôt inversé ces deux lignes.
    Comment dire... Pour moi, dans FH_OUT, au début, il n'y a rien, alors pourquoi redirige-t-on la sortie dans un autre fichier ...?

    Et sinon, à quoi sert le $! ?

    Si vous en avez marre de mes questions, n'hésitez pas ^^'

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Comme Fryhandiz j'ai des interrogations sur le fonctionnement de certaines lignes du script

    Le même questionnement pour :

    close $_ for values %FH;
    Sinon une autre question

    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
    use strict;
    use warnings;
     
    my %FH; # hachage de file handles
     
    while (my $line = <DATA>) {
    	chomp $line;
    	my $id = $1 if $line =~ /(\d+)$/;
    	create_file($id) unless exists $FH{$id};  # ouverture du fichier s'il n'existe pas
    	print {$FH{$id}} "$line\n";
    }
    close $_ for values %FH;
     
    sub create_file {
    	my $id = shift;
    	my $file_out = "resultat_$id.txt";
    	open my $FH_OUT, ">", $file_out or die "Ouverture impossible de $file_out $!";
    	$FH{$id} = $FH_OUT;
    }
    Dans la subroutine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open my $FH_OUT, ">", $file_out or die "Ouverture impossible de $file_out $!";
    	$FH{$id} = $FH_OUT;
    $FH_OUT est un fielhandle pour écrire dans le fichier $file_out crée plus haut.
    mais ...
    $FH_OUT est une valeur vide pour le moment

    Elle est remplis par la dernière ligne de la boucle while ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print {$FH{$id}} "$line\n";
    Si c'est le cas il faut lire $FH{$id} = $FH_OUT; de droite à gauche pour que le fichier soit remplis avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $FH_OUT, ">", $file_out
    ?

    Si je n'ai pas été assez clair je ferais plus simple

  11. #11
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par FryHandiz Voir le message
    D'accord, je comprends beaucoup mieux, merci beaucoup !
    Cependant, encore une petite question ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    close $_ for values %IF;
    ça sert à quoi...? Si on ne ferme pas, ça fait quoi ?
    En fait, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    close $_ for values %FH;
    Cela ferme tous les fichiers en écriture. Ça ne sert pas à grand chose dans ce cas précis à vrai dire, parce que un programme Perl qui se termine ferme de lui-même tous les fichiers ouverts, mais c'est tout de même une bonne pratique de fermer les fichiers (surtout ceux en écriture) en fin de traitement pour garantir que tout a bien été écrit (les écritures étant bufférisées, les dernières données ne sont réellement écrites que quand on ferme le file handle). C'est surtout utile quand on désire réouvrir le fichier dans le même programme, ou utiliser ou visualiser ce fichier alors que le programme tourne encore, ce qui peut arriver pour des programmes qui font successivement plusieurs choses dont l'exécution est très longue.

    Citation Envoyé par FryHandiz Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	open my $FH_OUT, ">", $file_out or die "Ouverture impossible de $file_out $!";
    	$FH{$id} = $FH_OUT;
    Donc ici, on "écrit" dans $file_out si je ne dis pas de bêtises ?
    Non, on stocke le file handle de ce fichier-là dans le hachage %FH pour pouvoir s'en servir ensuite.

    Chaque fois que l'on rencontre un nouvel ID (un ID pas encore rencontré), on ouvre un nouveau fichier, ce qui a pour effet de créer un nouveau file handle ($FH_OUT), et on stocke le file handle obtenu ($FH_OUT) dans le hachage %FH, pour pouvoir ensuite écrire sur ce file handle quand on verra à nouveau cet ID, mais on écrira dans ce file handle en utilisant $FH{$id}, et non $FH_OUT, variable qui n'existe en fait plus quand on sort de la fonction de création. C'est la même variable temporaire $FH_OUT qui est utilisée pour chaque ouverture de fichier, mais elle contient à chaque fois quelque chose de différent, et c'est ce contenu que l'on stocke dans le hachage pour pouvoir écrire ensuite dans le fichier voulu.

    Citation Envoyé par FryHandiz Voir le message
    Et sinon, à quoi sert le $! ?
    C'est une variable spéciale qui contient le message renvoyé par le système d'exploitation si l'ouverture d'un fichier (ou un autre appel système) n'a pas pu avoir lieu. En cas d'échec, elle contiendra par exemple un message disant d'un fichier ouvert en lecture n'existe pas, ou que le répertoire où l'on désire créer un fichier en écriture n'existe pas ou n'est pas accessible (privilèges insuffisants, par exemple). Bref, afficher le contenu de cet variable en cas de problème donne des indications assez précieuses sur la nature du problème rencontré, ce qui aide à le corriger.

  12. #12
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    D'accord je comprends mieux ! Merci beaucoup Lolo !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/07/2013, 21h39
  2. [XL-2002] Macro recherche valeur colonne+application formule
    Par help_2008 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/04/2009, 13h44
  3. [Débutant][JSP]Récupération valeur de checkbox
    Par Crazyblinkgirl dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 01/09/2004, 09h16
  4. récupération valeur id auto incrément
    Par Jovial dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/08/2004, 08h56
  5. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47

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