Recuperation des données d'un fichier texte

Recuperation des données d'un fichier texte - Perl - Programmation

Marsh Posté le 16-11-2019 à 18:13:25    

Bonjour,
 
je suis novice en perl et je veux traiter un fichier texte qui a des données(données espacées) comme ceci :

Code :
  1. 0AC@21XAA          A NAAA_001 MARRT     AC@21XAA         NREP_250 MARRT     
  2.                      NBBB_250 MARRT                                          A AC@21XAA         NREP_001 MARRT


 
 
Je veux récupérer dans chaque ligne,chacune des données et separer par un diese"#" et mettrer null la où la donnée est vide.
 
Ensuite le mettre dans un autre fichier.
 
Comment faire


Message édité par lnquaidorsay le 19-11-2019 à 06:46:34
Reply

Marsh Posté le 16-11-2019 à 18:13:25   

Reply

Marsh Posté le 18-11-2019 à 11:16:08    

Bonjour,
 
Quand il y a ceci : A NAAA_001 MARRT
Ça te fait combien de champs? 1, 2 ou 3?
Et donne un exemple de sortie voulue.
 
A+,


Message édité par gilou le 18-11-2019 à 11:16:25

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

Marsh Posté le 19-11-2019 à 06:27:47    

oui c'est ça A NAAA_001 MARRT => donne 3 champs
et je veux A#NAAA_001#MARRT

Reply

Marsh Posté le 19-11-2019 à 09:59:43    

Je suis nul en perl, par contre Gilou vas surement pouvoir te dépanner, par contre faut poser ta question plus précisément.
Quand il dit un exemple de sortie, il parle des tes deux lignes complété avec les NULL aussi, pacque là on ne sait même pas quel est lé délimiteur entre les champs...


---------------
D3
Reply

Marsh Posté le 19-11-2019 à 21:14:55    

Au fait les deux lignes là se repetent tous de la même façon. il faut arriver à recupérer sur une ligne un groupe des 11 valeurs qui sont présents ou absents.
s'ils sont pas nlà, voilà pourquoi je dis que c'est null.

Reply

Marsh Posté le 19-11-2019 à 22:24:41    

Bon la tu as une solution générique qui dépend pas du nombre de champs ni ne suppose les lignes complètes (mais qui suppose que tout les n-ième champs présents sont de même longueurs et alignés) .
 

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use feature 'bitwise';
  6. no warnings qw(experimental::bitwise);
  7. # On determine ou sont les champs avec un masque
  8. my $mask='';
  9. my $input='input.txt';
  10. open(my $infh, '<', $input);
  11. while (<$infh> ) {
  12.    chomp;
  13.    s/\S/1/g;
  14.    s/\s/0/g;    
  15.    $mask = $mask |. $_ ;  
  16. }
  17. my $fullen = length($mask);
  18. # print "$mask\n";
  19. # On tire une expression regulière du masque
  20. my $pattern = $mask;
  21. $pattern =~ s/0/\\s/g;
  22. $pattern =~ s/(1+)/($1)/g;
  23. $pattern =~ s/1/./g;
  24. # print "$pattern\n";
  25. my $nbgroups = () = $pattern =~ /\(/gi;
  26. # print "$nbgroups\n";
  27. my $output='output.txt';
  28. open(my $outfh, '>', $output);
  29. seek($infh, 0, 0);
  30. while (<$infh> ) {
  31.    chomp;
  32.    # on fait du padding avec des espaces pour atteindre la longueur de la plus grande ligne
  33.    my $pad = ' ' x ($fullen - length($_));
  34.    my $line = $_ . $pad;
  35.    # print "|$line|\n";
  36.    # On matche la ligne au pattern
  37.    my @matches = $line =~ m/^$pattern$/;
  38.    if (0+@matches != $nbgroups) {
  39.         print "Error, inconsistent line with pattern!!\nAborting process!\n";
  40.         last;
  41.    }
  42.    # On construit la ligne de sortie et on l'écrit
  43.    my $result="";
  44.    foreach my $match (@matches) {
  45.         if ($match =~ /^\s+$/) {
  46.             $result.="null";
  47.         }
  48.         else {
  49.             $result.=$match;  
  50.         }
  51.         $result.='#';  
  52.    }
  53.    chop $result;
  54.    print $outfh "$result\n";
  55. }
  56. close $outfh;
  57. close $infh;


 
Deux choses intéressantes dans ce code :
ligne 17 : $mask = $mask |. $_ ;  utilisation d'un bitwise string operator |.
ligne 43: my @matches = $line =~ m/$pattern/; On construit la liste des matched groups.
 
Un truc un peu tricky ligne 28 : my $nbgroups = () = $pattern =~ /\(/gi;
si je fais my $nbgroups = my @a = qw(aa bb cc);
c'est équivalent a  
my @a = qw(aa bb cc);
je crée une variable @a et je lui assigne 3 elts
my $nbelems = @a;  
je crée $nbelems et lui assign le nb d'elements de @a.
En faisant my $nbelems = () = qw(aa bb cc); j'évite de créer une variable @a.
 
A+,


Message édité par gilou le 20-11-2019 à 12:03:24

---------------
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