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
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
Utilise une expression régulière afin de récupérer tes valeurs
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)
Tu peux utiliser un array de array stockant tes valeurs pour ensuite travailler par colonne
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
Utilise une structure ainsi un hash de array qui se déclare my %tab.
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; ... }
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
Où est le rapport avec la bioinformatique? Quel type de fichier est-ce?
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]; }
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
C'est mieux de prendre un array de array ... mon idée de prendre un hash est stupide
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.
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]; }
Peux tu mettre un exemple de lignes ?
Quelle est la taille de ton fichier ?
Quel est le séparateur de tes colonnes ? une tabulation ?
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)
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
La taille en octet de ton fichier ? C'est histoire de savoir si on peut le charger en mémoire ?
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é.le souci: j'aimerai traiter verticalement avec le moins de commande possible (lecture verticale, ) pour minimiser le temps
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
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.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager