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

  FORUM HardWare.fr
  Programmation
  Perl

  Recuperation des données d'un fichier texte

 



Données fichier texte perl




Attention si vous cliquez sur "voir les résultats" vous ne pourrez plus voter

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recuperation des données d'un fichier texte

n°2341581
lnquaidors​ay
Posté le 16-11-2019 à 18:13:25  profilanswer
 

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
mood
Publicité
Posté le 16-11-2019 à 18:13:25  profilanswer
 

n°2341642
gilou
Modérateur
Modzilla
Posté le 18-11-2019 à 11:16:08  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2341708
lnquaidors​ay
Posté le 19-11-2019 à 06:27:47  profilanswer
 

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

n°2341716
mechkurt
Posté le 19-11-2019 à 09:59:43  profilanswer
 

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
n°2341763
lnquaidors​ay
Posté le 19-11-2019 à 21:14:55  profilanswer
 

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.

n°2341764
gilou
Modérateur
Modzilla
Posté le 19-11-2019 à 22:24:41  profilanswer
 

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

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

  Recuperation des données d'un fichier texte

 

Sujets relatifs
Macro copie vers un autre fichierScript Copie de fichier avec exclusion de certain fichier
[PostgreSQL] Question cluster (HA, réplication de données)Mettre du texte en couleur sous Wordpress
Import/Export de fichier (automatisation)Problème de caractères spéciaux tkinter et fichier texte (Resolu)
Script qui récupère données fichier Excel vers documentConnecter sur la base de données Sybase ASE avec visual studio 2013
aide recuperation donnees d'un fichier texte 
Plus de sujets relatifs à : Recuperation des données d'un fichier texte


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