[PERL]: HELP script traitement txt tabulaire
Résolu
piccolupo13
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
piccolupo13 Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
piccolupo13 Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
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 :
(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 :
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à :
;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
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:
- [PERL]: HELP script traitement txt tabulaire
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- DzSoft Perl Editor - Télécharger - Édition & Programmation
- Comment lire un fichier .pl perl ? - Forum Windows
- Perl: transformer un fichier en package ✓ - Forum Perl
2 réponses
#!/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
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$
Merci beaucoup en tout cas,
Je te souhaite une bonne soirée et à bientôt!
Piccolupo13