Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1712 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  utiliser les valeurs de deux fichiers

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

utiliser les valeurs de deux fichiers

n°2230974
morocco
Posté le 16-06-2014 à 12:54:58  profilanswer
 

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 ?
 

mood
Publicité
Posté le 16-06-2014 à 12:54:58  profilanswer
 

n°2230988
gilou
Modérateur
Modzilla
Posté le 16-06-2014 à 14:53:01  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2230992
morocco
Posté le 16-06-2014 à 15:13:49  profilanswer
 


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

n°2230997
morocco
Posté le 16-06-2014 à 16:03:30  profilanswer
 


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é  :??:  

n°2231001
gilou
Modérateur
Modzilla
Posté le 16-06-2014 à 16:30:52  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2231029
morocco
Posté le 17-06-2014 à 10:59:41  profilanswer
 

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

n°2231068
gilou
Modérateur
Modzilla
Posté le 17-06-2014 à 13:54:05  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2231071
morocco
Posté le 17-06-2014 à 14:28:33  profilanswer
 


Ça marche !
Merci

n°2244329
celine2000
Posté le 28-11-2014 à 15:19:31  profilanswer
 

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

n°2244356
gilou
Modérateur
Modzilla
Posté le 28-11-2014 à 18:15:17  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
mood
Publicité
Posté le 28-11-2014 à 18:15:17  profilanswer
 

n°2244359
celine2000
Posté le 28-11-2014 à 18:56:22  profilanswer
 

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
 

n°2244376
gilou
Modérateur
Modzilla
Posté le 28-11-2014 à 21:50:18  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2244385
celine2000
Posté le 28-11-2014 à 22:21:16  profilanswer
 

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

n°2244389
celine2000
Posté le 28-11-2014 à 22:40:13  profilanswer
 

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

n°2244407
gilou
Modérateur
Modzilla
Posté le 28-11-2014 à 23:57:55  profilanswer
 

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!    --    In umbra igitur pugnabimus. --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  utiliser les valeurs de deux fichiers

 

Sujets relatifs
Ouvrir plusieurs fichiers en vbautiliser boost pour générer des variables aléatoires
SUPPRESSION DE FICHIERS PAR LA COMMANDE RMDIR ET RECUVA.Utiliser les classes en Java avec eclipse
Rapatrier les infos de plusieurs fichiers dans un classeur excelOuvrir des fichiers dont le nom est incrémenté avec scilab
Utiliser plusieurs libs graphiques : ne pas perdre de performancesOrganisation des fichiers de la BDD
[PHP] Quelle API pour utiliser les données de localisation ?[FORTRAN] Ouvrir les fichiers d'un répertoire sans connaitre leur nom
Plus de sujets relatifs à : utiliser les valeurs de deux fichiers


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR