[PERL]: HELP script traitement txt tabulaire

Résolu
piccolupo13 Messages postés 4 Statut Membre -  
piccolupo13 Messages postés 4 Statut Membre -
Bonjour à tous,

J'espère que je poste au bon endroit...

Je ne connais pas encore toute les possibilités offertes par Perl, et j'aurais besoin d'aide svp concernant un problème de traitement de fichier texte via un script Perl (et uniquement en Perl).

Mon fichier texte (il s'agit d'un lexique) se présente sous la forme suivante :

fait    ADJ     fait
faites  VER:conj        faire
faite   VER:pper        faire
fait    NOM     fait
faitout NOM     faitout
faitouts        NOM     faitout
faits   VER:pper        faire
fait    VER:conj        faire
fait    VER:pper        faire
etc.


(NB : les blancs entre les colonnes sont des tabulations.)

J'aimerais dans un premier temps pourvoir opérer un tri sur la première colonne, c-à-d obtenir l'affichage suivant :

fait    ADJ     fait
fait    NOM     fait
fait    VER:conj        faire
fait    VER:pper        faire
faite   VER:pper        faire
faites  VER:pres        faire
faits   VER:pper        faire
faitout NOM     faitout
faitouts        NOM     faitout


ensuite mon problème principal est le suivant: si j'ai une ligne où l'élément de la première colonne est répété

(dans mon exemple :

fait ADJ fait
fait NOM fait
fait VER:conj faire
fait VER:pper faire
)

j'ai besoin de regrouper ces lignes en ne gardant que le mot de la première colonne mais en conservant les informations des colonnes 2 et 3 (des autres lignes) sur la première ligne, afin d'obtenir le format suivant (les blancs devant toujours être des tabulations) :

fait ADJ fait NOM fait VER:conj faire VER:pper faire

et j'ai besoin de faire ça dans tout mon fichier à chaque fois que ce cas de figure se présente (avec d'autres mots que fait), le tout dans un script...

Pour l'instant j'en suis là :
#!/usr/bin/perl -w
while(<>)
{

}
...

;o)

Je ne sais pas si je suis suffisamment clair, mais si quelqu'un a une piste pour réaliser ça, ce serait sympa...

Un grand merci d'avance pour vos suggestions !

Amicalement,

Piccolupo 13
Configuration: Linux
Konqueror 3.5

2 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    #!/usr/bin/perl
    use strict;use warnings;
    
    my %h;
    
    while(<>){
      chomp and  my ($k,$v) = split /\t+/,$_,2;
    
    # ici j'enleve d'abord le caractère saute de ligne \n
    # ensuite je sépare la chaine de la façon suivante
    # $k contiendra le 1er mot (Exemple : fait)
    # $v contendra le reste de la chaîne (Exemple : ADJ     fait)
    
      push @{$h{$k}},split /\t+/,$v
    
    # ici c'est un peu plus compliqué
    # en fait j'utilise hachage de tableaux
    # chaque clé est une référence à un tableau anonyme
    # et pour chaque mot  (vu que la clés est unique)
    # je rajoute avec push le reste de la ligne
    # en les eclatant sur les tabulations
    # donc chaque mots sera un élément de tableau
    # qui permettra peut être une utilisation ultérieure
    # ce n'était pas vraiment nécessaire, mais bon
    # tu ne vas pas te facher pour autant :-)
    }
    # pour chaque clé de hachage (qui est le mot)
    # je sort et j'affiche le tableau qui contient toutes les correspondances
    # pour chaque mot
    
    printf "%-15s @{$h{$_}}\n",$_ foreach (sort keys %h);
    
    __END__
    Il faut voir les fonctions chomp, split, push, sort
    ainsi que les listes, les tableaux, les hash
    et ensuite les structures de données en Perl
    
    2
    1. piccolupo13 Messages postés 4 Statut Membre 32
       
      OK, effectivement c'est très judicieux de stocker les mots de cette façon, car même si ce n'est pas nécessaire dans l'immédiat, ça va me servir quand même (pour faire des tris sur ce que je veux afficher et autres...) :o)

      Merci beaucoup en tout cas,

      Je te souhaite une bonne soirée et à bientôt!

      Piccolupo13
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    lami20j@deb:~/trash$ cat ccm.pl
    #!/usr/bin/perl
    use strict;use warnings;
    
    my %h;
    
    while(<>){
      chomp and  my ($k,$v) = split /\t+/,$_,2;
      push @{$h{$k}},split /\t+/,$v
    }
    printf "%-15s @{$h{$_}}\n",$_ foreach (sort keys %h);
    __END__
    lami20j@deb:~/trash$ cat piccolupo
    fait    ADJ     fait
    faites  VER:conj        faire
    faite   VER:pper        faire
    fait    NOM     fait
    faitout NOM     faitout
    faitouts        NOM     faitout
    faits   VER:pper        faire
    fait    VER:conj        faire
    fait    VER:pper        faire
    lami20j@deb:~/trash$ perl ccm.pl piccolupo
    fait            ADJ fait NOM fait VER:conj faire VER:pper faire
    faite           VER:pper faire
    faites          VER:conj faire
    faitout         NOM faitout
    faitouts        NOM faitout
    faits           VER:pper faire
    lami20j@deb:~/trash$
    
    0
    1. piccolupo13 Messages postés 4 Statut Membre 32
       
      Bonsoir lami20j !

      Tout d'abord un grand MERCI pour ta réponse si rapide et efficace.
      Sans vouloir abuser de ton aide, pourrais-tu m'expliquer un petit peu ce que font les lignes de ton script ?
      d'avance merci ;)

      Piccolupo 13
      0