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 :

[débutant] ouverture de fichier multiple


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Points : 34
    Points
    34
    Par défaut [débutant] ouverture de fichier multiple
    Bonjour,

    je suis débutant en Perl et voila mon problème, je souhaiterais ouvrir plusieurs fichiers, récupérer des infos dans ces fichiers et ensuite les réécrire dans un nouveau fichier.
    Le problème c'est que je n'arrive pas à ouvrir plusieurs fichiers

    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
    use strict;
    use warnings;
    use Data::Dumper;
    system("ls /read_count/*out.tab > /read_count/liste_fichier.tmp");
     
    my $n=0;
    my $i=0;
    my $f_filen="f_star".$n; ## le problème vient d'ici...
    my $rep="/read_count/ADNc[0-9]_ReadsPerGene-4.out.tab";
    my $rep_liste_f="/read_count/liste_fichier.tmp";
    print($f_filen."\n");
     
    open liste_f, $rep_liste_f or die "Impossible d'ouvrir le fichier liste_f, $!";
    open f_new, "> /read_count/cat_read_count.txt" or die "Impossible d'ouvrir le fichier f_new, $!";
    while (my $file = <liste_f>)
    {
    	$n+=1;
    	open $f_filen, $file or die "Impossible d'ouvrir le fichier $f_filen, $!";
    }
     
    my @col_star;
    my @col_all;
    my $add;
    while ($i < $n)
    {
    	while (defined(my $line_star = <$f_filen>))
    	{
    		@col_star = split(/\t/,$line_star);
    		## $add = $col_star[2] + $col_star[3];
    		push(@col_all,$add);
    		## print f_new $col_rsem[4] . "\t" . $col_star[2] . "\t" . $col_star[3] . "\t" . $add . "\n" ;
    	}
    }
     
    print f_new @col_all;
     
    foreach my $file ($rep)
    {
    		close f_star;
     
    }
    system("rm /read_count/liste_fichier.tmp");
    close f_new;
    la console me renvoie cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't use string ("f_star0") as a symbol ref while "strict refs" in use at cat_tab_star.pl line 26, <liste_f> line 1.
    je pense que c'est la mauvaise initialisation de ma valeur qui pose problème..., mais je n'ai pas réussi à trouver de solution sur internet...

    Le but final de mon script étant de récupérer les colonnes 3 et 4 de mes fichiers de les additionner et des les réécrire dans un nouveau fichier....
    (Il y a surement encore beaucoup d'erreurs mais je m'en occuperai plus tard).

    Merci pour votre aide !

    Bonne soirée

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    premier point, quand tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (my $file = <liste_f>)
    {
    	$n+=1;
    	open $f_filen, $file or die "Impossible d'ouvrir le fichier $f_filen, $!";
    }
    tu ouvres tes fichiers avec toujours le même file handler, le fait d'incrémenter $n ne change pas la valeur de la variable $_filen, à savoir "f_star0". A partir de là, le reste (si j'ai compris ce que tu cherches à faire) ne peut pas marcher.

    Si tu veux ouvrir plusieurs fichiers, il faut utiliser un tableau ou un hachage de file handlers.

    Par exemple quelque chose dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    my $n = 0;
    my @OUT_FH;
    while (my $file = <liste_f>)
    {
    	chomp $file;
    	open my $OUT, $file or die "Impossible d'ouvrir le fichier $f_filen, $!";
    	$n+=1;
    	$OUT_FH[$n] = $OUT;
    }
    Ensuite, tu peux avoir quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while ($i < $n)
    {
    	while (my $line_star = <{$OUT_FH[$i]}>)
    	{
    		# ...
    		# Il manque apparemment une incrémentation de $i
    	}
    }
    Mais compte tenu de ce que tu sembles vouloir faire avec ton code, tout cela est bien compliqué, tu n'as, semble-t-il nullement besoin de plusieurs file handlers. Tu peux ouvrir les fichiers un par un:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while  (my $file = <liste_f>) 
    {
    	chomp $file;
    	open my $OUT, "<", $file or die "Ouverture impossible de $file $!";
    	while (my $line_star = <$OUT>)
    	{
    		# ... lecture du fichier courant et utilisation des données
    		#
    	}
    	close $OUT;
    }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    pour commencer merci de me répondre.

    J'ai donc fait comme ça
    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
    my $n=0;
    my $i=1;
    my @OUT_FH; 
    my $LECTURE; 
    my $rep="/ADNc[0-9]_ReadsPerGene-4.out.tab";
    my $rep_liste_f="/read_count/liste_fichier.tmp";
     
    open liste_f, $rep_liste_f or die "Impossible d'ouvrir le fichier liste_f, $!";
    open f_new, "> /read_count/cat_read_count.txt" or die "Impossible d'ouvrir le fichier f_new, $!";
    while(my $file = <liste_f>)
    {
    	chomp ($file);
    	open my $LECTURE, "$file" or die "Impossible d'ouvrir le fichier $LECTURE, $!";
    	chomp ($LECTURE);
    	$n+=1;
    	$OUT_FH[$n] = $LECTURE;
    }
    quand je fais un print de $LECTURE la console me renvoie "GLOB(0x1dd4cb8)"
    quand je fais un print de $OUT_FH[$n] la console me renvoie "GLOB(0x1dd4cb8)" (donc la mm valeur).

    Mais dans la suite de 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
    my @col_star;
    my @col_all;
    my $add;
    while ($i <= $n)
    {
    	chomp(@col_star);
    	while (defined(my $line_star = <$OUT_FH[$i]>))
    	{
    		@col_star = split(/\t/,$line_star);
    		print($col_star[2] . "col_star[2]");
    		print($col_star[3] . "col_star[3]");
    		$add = $col_star[2] + $col_star[3];
    		push(@col_all,$add);
    	}
    	$i+=1;
    }
    Mon fichier n'est pas lu... et la console me renvoie GLOB(0x1dd4cb8) (à savoir la référence qui correspond à mon fichier que je veux lire...)

    Je n'arrive pas à identifier le problème...

    Encore merci à vous

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Remplace ma ligne concernée par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (defined(my $line_star = <{$OUT_FH[$i]}>))
    { ...
    donc avec des accolades en plus autour du file handler (comme je l'avais fait dans mon exemple de code). Les accolades sont nécessaires dès qu'un file handler n'est pas un scalaire simple, mais un élément de tableau (comme ici) ou de hachage.


    J'ajoute, mais ce n'est pas grave, que le "defined" n'est pas nécessaire. Donc tu peux mettre plus simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (my $line_star = <{$OUT_FH[$i]}>)
    { # ...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Oui désolé,

    mais j'avais bien rajouté les accolades hier après mais même avec ça ne fonctionne pas...

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Oui, tu as raison, pour une raison ou pour une autre, la syntaxe que j'ai proposée ne semble pas marcher, alors que je suis sûr de l'avoir déjà fait, ou presque la même chose, il y a sans doute un point de détail qui m'échappe pour l'instant.

    Pas le temps maintenant de trouver la raison, mais ça marche avec cette variante:
    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
     
    my @in_fh;
    my $count = 0;
    while (my $line = <DATA>) {
    	chomp $line;
    	open my $IN, "<", $line or die "Ouverture impossible de $line $!";
    	$in_fh[$count] = $IN;
    	$count++;
    }
     
    my $i = 0;
    while ($i <= $count) {
    	while (my $line = readline $in_fh[$i] ) {
    		print $line;
    	}
    	$i++;
    	print "\n";
    }
    __DATA__
    un.txt
    deux.txt
    Voici les deux fichiers en entrée et le résultat de l'exécution:
    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
     
    $ cat un.txt
    un
    deux
    trois
     
    $ cat deux.txt
    deux
    quatre
    six
     
    $ perl  tableau_fh.pl
    un
    deux
    trois
     
    deux
    quatre
    six

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Super !

    Cette fois ci ça a marché,

    donc maintenant j'ai un nouveau problème...
    J'aimerai print mes colonnes dans un nouveau fichier de façon à ce que chaque colonne soit côte à côte... Mais je n'arrive pas organiser mon code...
    Je fais ceci:

    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
    my $n=0;
    my $i=0;
    my @OUT_FH; ## crée un array qui va contenir le nom des fichiers
    my $LECTURE; ## variable scalaire qui va prendre comme valeur le nom du fichier ouvert en mode lecture
    my $rep="/read_count/ADNc[0-9]_ReadsPerGene-4.out.tab";
    my $rep_liste_f="/read_count/liste_fichier.tmp";
     
    open liste_f, $rep_liste_f or die "Impossible d'ouvrir le fichier liste_f, $!";
    open f_new, ">/read_count/cat_read_count.txt" or die "Impossible d'ouvrir le fichier f_new, $!";
     
    while(my $file = <liste_f>)
    {
    	chomp ($file);
    	$OUT_FH[$n] = $LECTURE;
    	$n++;
    }
    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
    my @col_star;
    my @col_all;
    my $add;
    my $add_2;
    my $j=0;
    while ($i < $n)
    {
    	chomp(@col_star); 
    	while (my $line_star = readline $OUT_FH[$i])
    	{
    		@col_star = split(/\t/,$line_star);
    		$add = $col_star[2] + $col_star[3];
    		$add_2= $add_2 . "$add \n"; ## rajoute la valeur $add à chaque tour
    	}
    	$i+=1;
    	$col_all[$j] = $add_2;
    	$j+=1;
    }
    au départ je voulais une fonction récursive pour mon programme récrive toutes les colonnes, mais je n'arrive pas à trouver comment faire...

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    désolé pour le double post, mais ça sera plus clair.

    Donc voila ce que j'ai fait:

    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
    my @col_star;
    my @col_all;
    my $add;
    my $add_2;
    my $j=0;
    my $x;
    my $k=0;
    while ($i < $n)
    {
    	chomp(@col_star); ## chomp la variable sinon je la perd
    	while (my $line_star = readline $OUT_FH[$i])
    	{
    		@col_star = split(/\t/,$line_star);
    		$add = $col_star[2] + $col_star[3];
    		$col_all[$j] = $add;
    		$j+=1;
    	}
    	$i+=1;
    }
    $x = $j/$i;
     
    while ($k < $x)
    {
    	print f_new $col_all[$k] . "\t" . $col_all[$k+$x] . "\t" . $col_all[$k+2*$x] . "\n";
    	$k+=1;
    }
    Bon voila c'est une solution, mais pas celle que je voudrais...
    ça m'oblige à prévoir le nombre de fichiers que j'aurai au départ, ici j'ai 3 fichiers, mais je voudrais réutiliser ce programme avec d'autres données où il y aura plus de fichiers.
    Le problème est que j'ai beaucoup de mal avec la récursivité... (qui je pense est la solution)

  9. #9
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Il y a certainement moyen d'organiser les données de façon à ce que ce soit plus simple, mais je ne comprends pas bien ce que tu fais. Il faudrait que tu montres à quoi ressemblent tes fichiers en entrée et le résultat que tu veux obtenir pour bien comprendre ce que tu cherches à faire.

    Cela dit, si j'ai bien compris la fin de ton programme, je pense que tu dois pouvoir rendre ton code indépendant du nombre de fichiers comme suit (et sans rien changer d'autre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while ($k < $x)
    {
    	my $output = "";
    	my $n = 0;
    	while (1) {
    		my $tmp =  $col_all[$k + $n * $k];
    		last unless defined $tmp;
    		$output .= "$tmp\t";
    		$n++;
    	}
    	print f_new "$output \n";
    	$k++;
    }

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    ok merci de la réponse mais je ne suis pas certain de comprendre ton code :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while ($k < $x)
    {
    	my $output = "";
    	my $n = 0;
    	while (1) {
    		my $tmp =  $col_all[$k + $n * $k]; ## je ne pense pas que cette formule convienne
    		last unless defined $tmp; ## last unless je ne connais pas...
    		$output .= "$tmp\t"; ## que fait le ".=" ?
    		$n++;
    	}
    	print f_new "$output \n";
    	$k++;
    }
    j'ai des fichiers qui ressemblent à ça :
    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
    gene:Minc3s00001g00001	203	204	0
    gene:Minc3s00001g00002	1270	1091	179
    gene:Minc3s00001g00003	3647	3571	76
    gene:Minc3s00001g00004	107	60	47
    gene:Minc3s00001g00005	282	262	20
    gene:Minc3s00001g00006	603	477	126
    gene:Minc3s00001g00007	264	172	92
    gene:Minc3s00001g00008	69	66	3
    gene:Minc3s00001g00009	1199	1113	88
    gene:Minc3s00001g00010	561	501	61
     
    ==> ADNc2_ReadsPerGene-4.out.tab <==
    gene:Minc3s00001g00001	1453	1447	6
    gene:Minc3s00001g00002	3836	3633	204
    gene:Minc3s00001g00003	7599	7516	87
    gene:Minc3s00001g00004	284	120	164
    gene:Minc3s00001g00005	887	834	53
    gene:Minc3s00001g00006	1234	1065	170
    gene:Minc3s00001g00007	809	691	118
    gene:Minc3s00001g00008	307	304	4
    gene:Minc3s00001g00009	2523	2443	81
    gene:Minc3s00001g00010	1135	1044	94
     
    ==> ADNc3_ReadsPerGene-4.out.tab <==
    gene:Minc3s00001g00001	905	901	4
    gene:Minc3s00001g00002	2486	2272	214
    gene:Minc3s00001g00003	5313	5204	110
    gene:Minc3s00001g00004	183	66	118
    gene:Minc3s00001g00005	608	575	33
    gene:Minc3s00001g00006	922	736	186
    gene:Minc3s00001g00007	539	424	115
    gene:Minc3s00001g00008	221	218	3
    gene:Minc3s00001g00009	1842	1762	80
    gene:Minc3s00001g00010	877	752	126
    en gros je souhaite récupérer les dernières colonnes de chaque fichier et les réécrire dans un nouveau fichier de façon à conserver l'ordre des lignes (donc les colonnes doivent être côte à côte).

    à la fin je veux récupérer ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gene_name 		ADNc1 	ADNc2 	ADNc3 
    gene:Minc3s00001g00001	204	1453	905
    gene:Minc3s00001g00002	1270	3837	2486
    gene:Minc3s00001g00003	3647	7603	5314
    gene:Minc3s00001g00004	107	284	184
    gene:Minc3s00001g00005	282	887	608
    gene:Minc3s00001g00006	603	1235	922
    gene:Minc3s00001g00007	264	809	539
    gene:Minc3s00001g00008	69	308	221
    gene:Minc3s00001g00009	1201	2524	1842
    donc pour l'instant je l'ai fait sur 3 fichiers mais je vais devoir le faire sur bcp plus de fichiers.

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par TrafalgarD Voir le message
    ok merci de la réponse mais je ne suis pas certain de comprendre ton code :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while ($k < $x)
    {
    	my $output = "";
    	my $n = 0;
    	while (1) {
    		my $tmp =  $col_all[$k + $n * $k]; ## je ne pense pas que cette formule convienne
    		last unless defined $tmp; ## last unless je ne connais pas...
    		$output .= "$tmp\t"; ## que fait le ".=" ?
    		$n++;
    	}
    	print f_new "$output \n";
    	$k++;
    }
    Sur la formule: exact, faute de frappe, ce devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $tmp =  $col_all[$k + $n * $x];
    Sinon, , "while (1)" fait une boucle infinie. Si $tmp n'est pas défini (donc si on est arrivé au bout du nombre de fichiers), "last" permet de sortir de la boucle. Et "unless" est équivalent à "if not".

    Le ".=" concatène la nouvelle valeur de $tmp à ce qui se trouve déjà dans $output.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $output .= "$tmp\t";
    est équivalent à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $output = $output . "$tmp\t";
    En définitive, $output accumule les champs "$col_all[$k + $n * $x]" tant qu'ils sont définis (et donc s'arrête quand on a atteint le nombre de fichiers utilisés précédemment en entrée.

    Sinon, au vu de tes explications et surtout de tes données, je pense pouvoir te proposer une solution globale nettement plus simple, probablement dans la soirée.

  12. #12
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je l'avais bien dit, mais tu n'as pas relevé:
    Mais compte tenu de ce que tu sembles vouloir faire avec ton code, tout cela est bien compliqué, tu n'as, semble-t-il nullement besoin de plusieurs file handlers. Tu peux ouvrir les fichiers un par un
    Voici un programme qui lit tes trois fichiers l'un après l'autre et stocke les données dans une structure de données utilisée ensuite pour faire la sortie:
    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
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my @liste_fic = glob "./trafalgar/*out.tab";
    my %data_struct;
    my @id_list;
    my $root_name = "gene:Minc3s00001g";
     
    for my $file (@liste_fic) {
    	my $file_id = $1 if $file =~ /(ADNc\d+)_/;
    	# push @id_list, $file_id; # -- inutile en l'état, je le laisse, ça peut servir pour une en-tête du résultat.
    	open my $IN, "<", $file or die "Ouverture impossible de $file $!";
    	while (my $line = <$IN>) {
    		my ($line_nr, $val) = $line =~ /^$root_name(\d+)\s+(\d+)/;
    		$data_struct{$line_nr}{$file_id} = $val;
    	}
    	close $IN;
    }
     
    # print Dumper \%data_struct;
    # print "\n\n";
     
    for my $line_nr (sort keys %data_struct) {
    	my $output = "";
    	$output .= "$data_struct{$line_nr}{$_}\t" for sort keys %{$data_struct{$line_nr}};
    	print "$root_name$line_nr\t$output\n";
    }
    Voici l'affichage des données obtenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    gene:Minc3s00001g00001  203     1453    905
    gene:Minc3s00001g00002  1270    3836    2486
    gene:Minc3s00001g00003  3647    7599    5313
    gene:Minc3s00001g00004  107     284     183
    gene:Minc3s00001g00005  282     887     608
    gene:Minc3s00001g00006  603     1234    922
    gene:Minc3s00001g00007  264     809     539
    gene:Minc3s00001g00008  69      307     221
    gene:Minc3s00001g00009  1199    2523    1842
    gene:Minc3s00001g00010  561     1135    877
    Et, pour faciliter la compréhension, voici l'affichage donné par Data:: Dumper sur la structure de données:
    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
     
    $VAR1 = {
              '00005' => {
                           'ADNc2' => '887',
                           'ADNc3' => '608',
                           'ADNc1' => '282'
                         },
              '00009' => {
                           'ADNc2' => '2523',
                           'ADNc3' => '1842',
                           'ADNc1' => '1199'
                         },
              '00002' => {
                           'ADNc2' => '3836',
                           'ADNc3' => '2486',
                           'ADNc1' => '1270'
                         },
              '00001' => {
                           'ADNc2' => '1453',
                           'ADNc3' => '905',
                           'ADNc1' => '203'
                         },
              '00008' => {
                           'ADNc2' => '307',
                           'ADNc3' => '221',
                           'ADNc1' => '69'
                         },
              '00007' => {
                           'ADNc2' => '809',
                           'ADNc3' => '539',
                           'ADNc1' => '264'
                         },
              '00003' => {
                           'ADNc2' => '7599',
                           'ADNc3' => '5313',
                           'ADNc1' => '3647'
                         },
              '00006' => {
                           'ADNc2' => '1234',
                           'ADNc3' => '922',
                           'ADNc1' => '603'
                         },
              '00010' => {
                           'ADNc2' => '1135',
                           'ADNc3' => '877',
                           'ADNc1' => '561'
                         },
              '00004' => {
                           'ADNc2' => '284',
                           'ADNc3' => '183',
                           'ADNc1' => '107'
                         }
            };
    Ce programme ne fait aucune hypothèse sur le nombre de fichiers en entrée et fonctionnera donc de la même façon quel que soit le nombre de fichiers (tant que le nombre reste raisonnable -- pas sûr que ça marche s'il y a des millions de fichiers).

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Super ! Merci le code marche très bien !

    Encore merci d'avoir passer autant de temps à m'aider !

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

Discussions similaires

  1. [LV 2.8] [Débutant] Lecture de fichier multiple
    Par Kent13 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 05/07/2010, 12h55
  2. [débutant] Ouverture d'un fichier txt
    Par sika central dans le forum LabVIEW
    Réponses: 5
    Dernier message: 29/09/2009, 11h59
  3. [Débutant] Création et ouverture de fichiers
    Par jef1910 dans le forum Cobol
    Réponses: 1
    Dernier message: 25/01/2008, 09h28
  4. Réponses: 4
    Dernier message: 18/08/2006, 07h57

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