[PERL]: HELP script traitement txt tabulaire

Résolu/Fermé
piccolupo13 Messages postés 4 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 16 octobre 2007 - 21 août 2007 à 18:29
piccolupo13 Messages postés 4 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 16 octobre 2007 - 21 août 2007 à 20:48
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
A voir également:

2 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
21 août 2007 à 20:21
#!/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
piccolupo13 Messages postés 4 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 16 octobre 2007 32
21 août 2007 à 20:48
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
21 août 2007 à 19:14
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
piccolupo13 Messages postés 4 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 16 octobre 2007 32
21 août 2007 à 19:49
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