Attention, dans ton fichier fic2.txt, il manque un espace entre la colonne 2 et la colonne 3 : le problème subsiste-t-il après correction ?
Version imprimable
Attention, dans ton fichier fic2.txt, il manque un espace entre la colonne 2 et la colonne 3 : le problème subsiste-t-il après correction ?
Il faut corriger la ligne :
Je n'avais pas tenu compte du cas où les deux homo étaient identiques.Code:
1
2 $columns->{$col_name} = $char_cmp < 0 ? $existing_col : $char_cmp > 0 ? $col_value : $existing_col eq $col_value ? $col_value : "XX";
salut philou merci pour tou ton travail
j'ai lancé le script il marche niquel y a juste une recherche horizontal
SI donnée manquante dans fic1 et donnée dans fic 2 il faut regarder que le resultat corresponde bien sur toute la ligne
exemple fic 1
test cyril philou anais robert
sb001 AA -- AA AA
fic2 cyril philou anais robert
sb001 AA BB AA AA
pour philou on doi laisser donnée manquante --
il est horrible se script lol
pareil pour hetero AZB fic 1 et hommo AA fic deux faut verifier avant qu'il soi comforme a la ligne
et pour hommo/hommo choisir le plus conforme
et la le script sera vraiment fini
ps philou on peu plus tenvoyer de mp tu en a trop dans ta boite lol
donc en gros il suffit que la donnée soit une fois dans la ligne pour valider l'entrée de la donnée au sinon on choisi de mettre donnée manquante au lieu de l'integré
C'est contradictoire avec ce que tu as spécifié dans ton message "13/03/2012 08h56".
Je comprends encore moins : le résultat correspond sur toute la ligne, sauf la colonne qu'on cherche à merger...Citation:
exemple fic 1
test cyril philou anais robert
sb001 AA -- AA AA
fic2 cyril philou anais robert
sb001 AA BB AA AA
pour philou on doi laisser donnée manquante --
Je ne vois donc vraiment pas sur quel critère objectif il serait possible de mettre une valeur différente de -- quand une des données est -- et pas l'autre.
1: il faut que tu précises ce que signifie "conforme à la ligne" (d'un point de logique, pas biologique).Citation:
il est horrible se script lol
pareil pour hetero AZB fic 1 et hommo AA fic deux faut verifier avant qu'il soi comforme a la ligne
2: il faut que tu me dises si les groupes de lettres peuvent contenir plus de 2 lettres, car l'algorithme qui compare le nombre de lettre différentes pour trouver le dominant n'est plus fiable (il faut d'ailleurs le spécifier pour des groupes à plus de 2 lettres).
ouf !Citation:
et pour hommo/hommo choisir le plus conforme
et la le script sera vraiment fini
J'ai fait du ménage hier, il reste quelques emplacements. Cela dit, le canal de dialogue le plus efficace, c'est ici (et le canal technique, c'est exclusivement ici :) ).Citation:
ps philou on peu plus tenvoyer de mp tu en a trop dans ta boite lol
pour faire simple
quand on a
donnée manquante dans un fichier et pas dans l'autre avant de l'integrer dans fic3
il faut regarder
qu'il soi conforme a la ligne du fichier donnée manquante
si la donnée est AA et que sur la ligne du fichier ou on veu integrer la donnée y a du AA on l'integre sinon on marque donnée manquante
voila
Ca n'est pas très rigoureux comme définition. Veux-tu dire que, si l'on a une donnée manquante dans fic1, on ne intègre celle de fic2 dans fic3 que si :
- elle est aussi présente dans au moins une autre colonne de fic1 ?
- elle est aussi présente dans au moins une autre colonne de fic2 ?
- elle est aussi présente dans au moins une autre colonne de fic1 ou de fic2 ?
- elle est aussi présente dans au moins une autre colonne de fic1 et de fic2 ?
- elle est aussi présente dans toutes les autres colonnes de fic1 ?
- elle est aussi présente dans toutes les autres colonnes de fic2 ?
- elle est aussi présente dans toutes les autres colonnes de fic1 ou de fic2 ?
- elle est aussi présente dans toutes les autres colonnes de fic2 et de fic2 ?
- ... autre chose ?
fic1 donnée manquantes --
fic2 donnée AA
dans fic3 on mais AA que si dans fic1 horizontalement y a du AA pour la ligne ou y a donnée manquante
fic1
test cyril philou
sb001 AA --
fic2
test cyril philou
sb001 AA AA
la on rajoute AA dans fic3 car il corespond bien
si c'etais BB on l'aurait pas enregistré a moins que pour un autre nom y aurait du BB
test cyril philou clotilde
sb001 AA -- BB
Ca complique les choses, il faut changer le prototype de la fonction merge_col. Je verrai cet après-midi.
Autre question : si dans fic1 on a AA AA et dans fic2 on a AA --, que fait-on ?
De même si dans fic1 on a BB AA et dans fic2 on a BB -- ???
Etc...
L'état du script actuel qui ne tient pas compte de mes dernières questions (par défaut, dans ces cas ci, la valeur de fic1 est toujours conservée, qu'elle soit déjà présente sur le ligne ou pas).
Code:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 #!/usr/bin/perl use strict; use warnings; use feature qw(:5.10); use List::MoreUtils qw(each_array); sub merge_cols(\@\@$) { my ($col_names, $col_values, $columns) = @_; my $col_index = 0; foreach my $col_value (@$col_values) { my $col_name = $col_names->[$col_index++]; if (!exists $columns->{$col_name}) { # add a new column $columns->{$col_name} = $col_value; } else { my $existing_col = $columns->{$col_name}; if ($existing_col eq "--") { # select current col if already present in the current line $columns->{$col_name} = (grep $col_value, values %{$columns}) ? $col_value : "XX"; } elsif ($col_value ne "--") { # select the dominant my %cur_char = map { $_ => 1 } split //, $existing_col; my %new_char = map { $_ => 1 } split //, $col_value; my $char_cmp = keys %cur_char <=> keys %new_char; $columns->{$col_name} = $char_cmp < 0 ? $existing_col : $char_cmp > 0 ? $col_value : $existing_col eq $col_value ? $col_value : "XX"; } } } } sub load_table { my ($result_tabref, $result_keyref, $file) = @_; open my $TABLE, "<", $file or die "Can't open $file: $!"; chomp(my $line = <$TABLE>); my ($test_key, @col_names) = split /\s+/, $line; if (!@$result_tabref) { # create the first row containing a test key and a hash of column names my $column_number = 1; push @$result_tabref, [ $test_key, { map { $_ => $column_number++ } @col_names } ]; } else { # complete the first row my $columns = $result_tabref->[0]->[1]; my $column_number = 1 + keys %$columns; $columns->{$_} = $column_number++ foreach grep !exists $columns->{$_}, @col_names; } #my $col_number = keys %{$result_tabref->[0]->[1]}; while (defined($line = <$TABLE>)) { chomp $line; my ($test_key, @col_values) = split /\s+/, $line; if (exists $result_keyref->{$test_key}) { # complete an existing row my $columns = $result_tabref->[$result_keyref->{$test_key}]->[1]; my $col_index = 0; merge_cols(@col_names, @col_values, $columns); } else { # create a list of missing column values (from the column number of the first row) my $col_index = 0; push @$result_tabref, [ $test_key, { map { $col_names[$col_index++] => $_ } @col_values } ]; $result_keyref->{$test_key} = $#$result_tabref; } } } sub print_table { my ($tabref, $file) = @_; open my $OUT, ">", $file or die "Can't open $file: $!"; # First row contains column names and positions ($other_cols is a hash) my ($first_col, $col_names) = @{shift @$tabref}; my @col_names = sort { $col_names->{$a} cmp $col_names->{$b} } keys %$col_names; say { $OUT } join " ", $first_col, @col_names; foreach my $row (@$tabref) { # First row contains column names and positions ($col_values is a hash) my ($test_key, $col_values) = @$row; say { $OUT } join " ", $test_key, map $col_values->{$_} // "--", @col_names; } } my (@table, %test_keys); load_table(\@table, \%test_keys, "fic1.txt"); load_table(\@table, \%test_keys, "fic2.txt"); print_table(\@table, "fic3.txt");
on met -- mais ca je l'ai changé dans le scrip c'est bon :)
Autre question : si dans fic1 on a AA AA et dans fic2 on a AA --, que fait-on ?
vu qui a que des AA dans fic3 y aura AA AA on rajoute
De même si dans fic1 on a BB AA et dans fic2 on a BB -- ???
la vu qui a que deux données et que onpar sur la regle pour validé il en faut au moins un pareil dans la ligne on met BB -- dans fic3
Voici une nouvelle version de la fonction merge_cols :
Code:
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 sub merge_cols(\@\@$) { my ($col_names, $col_values, $columns) = @_; my $col_index = 0; foreach my $col_value (@$col_values) { my $col_name = $col_names->[$col_index++]; if (!exists $columns->{$col_name}) { # add a new column $columns->{$col_name} = $col_value; } else { my $existing_col = $columns->{$col_name}; if ($existing_col eq "--" || $col_value eq "--") { my $value = $existing_col eq "--" ? $col_value : $existing_col; # select current col if already present in the current line $columns->{$col_name} = (grep $_ eq $value, values %{$columns}) ? $col_value : "--"; } else { # select the dominant my %cur_char = map { $_ => 1 } split //, $existing_col; my %new_char = map { $_ => 1 } split //, $col_value; my $char_cmp = keys %cur_char <=> keys %new_char; $columns->{$col_name} = $char_cmp < 0 ? $existing_col : $char_cmp > 0 ? $col_value : $existing_col eq $col_value ? $col_value : "XX"; } } } }
~/perl> perl compa4.pl
Undefined subroutine &main::merge_col called at compa4.pl line 65, <$TABLE> line 17.
merge_col($col_names[$col_index++], $col_value, $columns);
apparament y a un problem sur cette ligne
Tu n'as pas récupéré correctement cette ligne dans post...
merci philou tout a l'air de fonctionner maintenant je dois faire un fichier de log a chaque fois que
-deux données fic1 et fic 2 hommo (AA AA) mais différentes je dois le marquer un txt pour avoir un journal de log
et hetero hetero ( AB AB) differents
je vais essayer de le faire si j'ai du mal je demanderais de l'aide...
merci encore une fois philou
je peux faire cela avec une fonction print qui dirige vers un autre fichier?
mais je trouve pas vraiment du a la complexité du script les fonctions qui permette la comparaison si homo homo différents... et hetero hetero...
je veux juste faire une alerte dans le fichier log pour dire attention la on avais deux homo différents ou deux hetero différents..
C'est possible, mais du fait que dans ce cas précis (et c'est le seul), on mets XX, il est assez facile de retrouver ces cas, non ?
Par ailleurs, précédemment, je t'avais proposé de mettre les deux valeurs homo ou hétéro en les séparant par un +, ce qui permet également de les repérer facilement.
Pour moi, le plus simple, c'est après l'appel à merge_cols, vérifier la présence de XX :Ceci sera affiché sur STDERR (donc facilement redirigeable).Code:
1
2
3 merge_cols(...); warn "Different homo/homo or hetero/hetero at line $. in\n$line\n" if grep $_ eq "XX" values %$columns;
finalement j'ai mi donnée manquante -- elle préfère du coup c'est un peu plus dur....