utiliser les valeurs de deux fichiers

utiliser les valeurs de deux fichiers - Perl - Programmation

Marsh Posté le 16-06-2014 à 12:54:58    

bonjour
 
j'ai 2 fichiers: un est sur 2 colonnes et un autre sur 3 colonnes.
fichier 1 est de la forme: trou    profondeur
                                  trX      12
                                  trY      45
                                  trZ      01
                                  trA      152
                                  trB      78
                                  trC      13
le fichier 2 est lui de la forme trou1    trou2      distance
                                        trA       trX         03
                                        trZ       trC         89
                                        ..........................
je voudrais pouvoir obtenir ceci pour:
trou1    trou2      distance  profondeur(trou1)     profondeur(trou2)
 trA       trX         03           152                           12
 trZ       trC         89            01                            13
   .......................................................................
 
la question que je me pose est: ce calcul est il possible ?
 

Reply

Marsh Posté le 16-06-2014 à 12:54:58   

Reply

Marsh Posté le 16-06-2014 à 14:53:01    

Bien sur, c'est juste de la combinaison d'infos, il n'y a pas de calcul.
Adapter ceci s'il ne convient pas totalement:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. open my $fhin, "<", 'ftrou1.txt';
  7. my %infos;
  8. while (<$fhin> ) {
  9.  next if $. < 2;         # a supprimer si pas d'en tête au fichier
  10.  if (/^\s*(\S+)\s+(\d+)\s*$/) {
  11.    $infos{$1} = $2;
  12.  }
  13. }
  14. close $fhin;
  15.  
  16. open $fhin, "<", 'ftrou2.txt';
  17. open my $fhout, ">", 'ftrou3.txt';
  18. print $fhout "trou1\ttrou2\tdistance\tprofondeur(trou1)\tprofondeur(trou2)\n"; # a supprimer si pas d'en tête au fichier
  19. while (<$fhin> ) {
  20.  next if $. < 2;         # a supprimer si pas d'en tête au fichier
  21.  if (/^\s*(\S+)\s+(\S+)\s+(\d+)\s*$/) {
  22.    if (defined($infos{$1}) && defined($infos{$2})) {
  23.      print $fhout "$1\t$2\t$3\t\t$infos{$1}\t\t\t$infos{$2}\n";
  24.    }
  25.  }
  26. }
  27. close $fhout;
  28. close $fhin;


 
A+,


Message édité par gilou le 16-06-2014 à 14:54:19

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-06-2014 à 15:13:49    


Ça fonctionne à merveille !  
Vous êtes mon héros
merci

Reply

Marsh Posté le 16-06-2014 à 16:03:30    


Encore une petite question.
J'ai ajouté un petit calcul de logarithme comme ceci: log(($3)/(($infos{$1})*($infos{$1}))
 mais lorsque je vérifie les résultats je me rend compte qu'il est erroné  :??:  

Reply

Marsh Posté le 16-06-2014 à 16:30:52    

La déjà, la formule a une parenthèse manquante:
log(($3)/(($infos{$1})*($infos{$1}))  -> log(($3)/(($infos{$1})*($infos{$1})))
Après, je ne sais pas ce que vous auriez aimé obtenir, alors...
Le log ici est le log naturel, pas celui en base 10.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-06-2014 à 10:59:41    

Bonjour,
pour la parenthèse c'est une erreur de frappe et pour le moment je laisse de coté ce problème de logarithme.
j'ai un autre souci de "combinaison d'info". à partir de la donnée ci-dessous je veux pouvoir obtenir un tableau à 2 dimensions (une matrice) pour continuer le traitement sous matlab.
trou1    trou2      logarithme  
 trA       trX         -4.12            
 trZ       trC         -1.57
 trB       trA         -2.12
 trX      trZ         -3.45
..............................
 
le résultat recherché est:
          trA     trB      trC     trX     trZ
trA       0        0        0      -4.12   0
trB      -2.12    0        0      0        0
trC      0         0        0       0       0
trX      0         0        0       0      -3.45
trZ      0         0    -1.57     0       0
 
merci de m'aider

Reply

Marsh Posté le 17-06-2014 à 13:54:05    

A adapter selon tes besoins:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. open my $fhin, "<", 'ftrou4.txt';
  7. my %donnees;
  8. while (<$fhin> ) {
  9.  next if $. < 2;         # a supprimer si pas d'en tête au fichier
  10.  if (/^\s*(\S+)\s+(\S+)\s+([-+]?\d+(\.\d+)?)\s*$/) {
  11.    $donnees{$1}{$2}  = $3;
  12.    $donnees{$2} //= (); # ou  $donnees{$2}{$1}  = $3; si la matrice est symmetrique
  13.  }
  14. }
  15. close $fhin;
  16.  
  17.  
  18. my @trous = sort(keys %donnees);
  19.  
  20. open my $fhout, ">", 'ftrou5.txt';
  21. print $fhout "\t", join("\t", @trous), "\n";
  22. foreach my $trou (@trous) {
  23.  my $started = 0;
  24.  foreach (@trous) {
  25.    unless ($started) {
  26.      print $fhout $trou;
  27.      $started = 1;
  28.    }
  29.    print $fhout "\t";
  30.    if (defined($donnees{$trou}) && defined($donnees{$trou}{$_})) {
  31.      print $fhout $donnees{$trou}{$_};
  32.    } else {
  33.      print $fhout 0;
  34.    }
  35.  }
  36.  print $fhout "\n";
  37. }
  38. close $fhout;


 
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-06-2014 à 14:28:33    


Ça marche !
Merci

Reply

Marsh Posté le 28-11-2014 à 15:19:31    

Bonjour
 
j'ai à peu pres le meme probleme que morocco sauf que pour moi les entetes des lignes et colonnes sont définies auparavant et contiennent plus d'éléments que les variables à placer.
j'ai essayé d'adapter le programme de Gilou mais ma table n'affiche que des zeros.
j'espere que mon probleme est clair
svp c'est urgent

Reply

Marsh Posté le 28-11-2014 à 18:15:17    

Bonjour Céline,  
Postes des extraits de chacun de tes fichiers source et du fichier résultat souhaité en sortie parce que sans indications plus précises, impossible de t'aider.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-11-2014 à 18:15:17   

Reply

Marsh Posté le 28-11-2014 à 18:56:22    

les fichiers sont volumineux, donc je vous donne juste un exemple:
fichier source:
        mot1   mot5  mot7
mot1     0       5    2
mot2     1       0    4
mot5     1       0    3
 
fichier de sortie:
        mot1   mot2  mot3  mot4  mot5  mot6   mot7
mot1     0       0       0       0       5       0       2
mot2     1       0       0       0       0       0       4
mot3     0       0       0       0       0       0       0
mot4     0       0       0       0       0       0       0
mot5     1       0       0       0       0       0       3
mot6     0       0       0       0       0       0       0
mot7     0       0       0       0       0       0       0
 

Reply

Marsh Posté le 28-11-2014 à 21:50:18    

Dans le fichier source, il y a que mot1   mot5  mot7  dans un sens, et mot1   mot2  mot5 dans l'ordre.
Ils sont pêchés ou les  mot3  mot4  et mot6?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-11-2014 à 22:21:16    

pardon pour l'erreur de frappe , je suis  bete  :heink:  
le fichier source est:
        mot1   mot5  mot7  
mot1     0       5    2  
mot5     1       0    4  
mot7     1       0    3  
 
 
et le fichier sortie est:
       mot1   mot2  mot3  mot4  mot5  mot6   mot7  
mot1     0       0       0       0       5       0       2  
mot2     0       0       0       0       0       0       0  
mot3     0       0       0       0       0       0       0  
mot4     0       0       0       0       0       0       0  
mot5     1       0       0       0       0       0       4  
mot6     0       0       0       0       0       0       0  
mot7     1       0       0       0       0       0       3

Reply

Marsh Posté le 28-11-2014 à 22:40:13    

c'est bon j'ai trouvé la solution. c'est un peu long mais ca me donne le bon résultat
Merci

Reply

Marsh Posté le 28-11-2014 à 23:57:55    

Si je comprends bien, ton fichier source st une matrice, et tu veux construire une matrice plus importante a partir de celle la, en gardant les coeffs de départ et en mettant a 0 les autres.
Mais ou pêches-tu les noms (et leur ordre) de tes coeffs?
 
Pour ton exemple, a toi d'adapter si nécessaire, un truc dans ce genre peut le faire:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. open my $fhin, "<", 'indata25.txt';
  7. my @cols;
  8. my %donnees;
  9. while (<$fhin> ) {
  10.  if ($. == 1) {
  11.    @cols = split;
  12.    next;
  13.  }
  14.  else {
  15.    my @lines = split;
  16.    my $line = shift @lines;
  17.    foreach (@cols) {
  18.      $donnees{$line}{$_} = shift @lines;
  19.    }
  20.  }
  21. }
  22. close $fhin;
  23.  
  24. my ($prefix, $maxval);
  25. foreach (@cols) {
  26.  if (/^(.*?)(\d+)$/) {
  27.    unless (defined $prefix) {
  28.      $prefix = $1;
  29.      $maxval = $2;
  30.    }
  31.    if ( $1 ne $prefix) {
  32.      die "Incorrect column prefix : $_ not $prefix!";
  33.    }
  34.    if ($2 > $maxval) {
  35.      $maxval = $2;
  36.    }
  37.  }
  38.  else {
  39.    die "Incorrect column name: $_!";
  40.  }
  41. }
  42.  
  43.  
  44. open my $fhout, ">", 'outdata25.txt';
  45. foreach (1..$maxval) {
  46.  print $fhout "\t".$prefix.$_;
  47. }
  48. print $fhout "\n";
  49. foreach my $l (1..$maxval) {
  50.  print $fhout $prefix.$l;
  51.  foreach my $c (1..$maxval) {
  52.    print $fhout "\t";
  53.    if (defined $donnees{$prefix.$l}{$prefix.$c}) {
  54.      print $fhout $donnees{$prefix.$l}{$prefix.$c};
  55.    }
  56.    else {
  57.      print $fhout 0;
  58.    }
  59.  }
  60.  print $fhout "\n";
  61. }
  62.  
  63. close $fhout;


Bon, c'est codé à vue et testé sur ton exemple, on doit pouvoir améliorer un peu la lisibilité de tout cela.
 
A+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed