Tabulations dans printf

Le
xavier
Bonjour,

Je sais depuis mes débuts en C (il y aeuh) formater de jolis
tableaux ASCII, avec toutes les options, même exotiques, qu'on retrouve
verbatim dans Perl.

Ce que je ne sais pas faire par contre, c'est formater avec le nombre de
tabulations ad-hoc, comme ceci :

cle_courte<TAB><TAB><TAB>valeur
cle_tres_longue<TAB><TAB>valeur

C'est pour remplir un ficchier qui sera exploité par un programme dont
je n'ai pas le source, mais dont on peut dire sans se tromper, qu'il
matche l'éqivalent Perl de [t]+ mais pas de [t ]+

Ca fait deux jours que je google sans succès, après avoir cherché en
vain dans CPAN.

Quelqu'un aurait-il une idée à m'indiquer ?

Merci,

--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #24101551
Bonjour,

Le 23/12/2011 15:35, Xavier a écrit :

Je sais depuis mes débuts en C (il y a...euh...) formater de jolis
tableaux ASCII, avec toutes les options, même exotiques, qu'on retrouve
verbatim dans Perl.

Ce que je ne sais pas faire par contre, c'est formater avec le nombre de
tabulations ad-hoc, comme ceci :

cle_courte<TAB><TAB><TAB>valeur
cle_tres_longue<TAB><TAB>valeur



Ouf ! Pas simple...

C'est pour remplir un fichier qui sera exploité par un programme dont
je n'ai pas le source, mais dont on peut dire sans se tromper, qu'il
matche l'équivalent Perl de [t]+ mais pas de [t ]+



Je suppose que les valeurs peuvent elles-même contenir des espaces,
lesquelles ne doivent pas être transformées en tabulations ?

Si ce n'est pas le cas, il te suffit de formater d'abord avec des
espaces, puis de passer le résultat à un outil qui remplace les
séries d'espaces par les tabulations appropriées.

Si tu n'es pas dans ce cas simple, mais que tu sais qu'une valeur ne
peut pas contenir plus de n espaces de suite (par exemple n=1), alors
voici une idée qui pourrait fonctionner, même si elle est un peu
tordue. J'explique en supposant des tabulations de 4.

1) Tu formates avec des espaces, en t'assurant que chaque valeur
commence après un multiple de 4 caractères. Ça je suppose que tu
dois savoir faire (et au passage c'était requis pour ma première
solution aussi). Il faut aussi qu'il y ait toujours plus de n
espaces, et je suppose que n < 4.

2) Tu remplaces partout " {1,3}(?= {4}+[^ ])" par <TAB>.

3) Tu remplaces partout " {4}" par <TAB>.

Note que 2 et 3 peuvent être réunis en une seule étape :
2&3) Tu remplaces partout "( {1,3}(?= {4}+[^ ])| {4})" par <TAB>.

Cordialement,
--
Olivier Miakinen
espie
Le #24101691
In article Xavier
Bonjour,

Je sais depuis mes débuts en C (il y a...euh...) formater de jolis
tableaux ASCII, avec toutes les options, même exotiques, qu'on retrouve
verbatim dans Perl.

Ce que je ne sais pas faire par contre, c'est formater avec le nombre de
tabulations ad-hoc, comme ceci :

cle_courte<TAB><TAB><TAB>valeur
cle_tres_longue<TAB><TAB>valeur

C'est pour remplir un ficchier qui sera exploité par un programme dont
je n'ai pas le source, mais dont on peut dire sans se tromper, qu'il
matche l'éqivalent Perl de [t]+ mais pas de [t ]+

Ca fait deux jours que je google sans succès, après avoir cherché en
vain dans CPAN.

Quelqu'un aurait-il une idée à m'indiquer ?



Text::Tabs
xavier
Le #24101681
Olivier Miakinen
Je suppose que les valeurs peuvent elles-même contenir des espaces,
lesquelles ne doivent pas être transformées en tabulations ?



Ben oui, sinon c'est pas drôle, et c'est sans doute pour ça que le soft
dont j'ai hérité se comporte de cette façon...

1) Tu formates avec des espaces, en t'assurant que chaque valeur
commence après un multiple de 4 caractères. Ça je suppose que tu
dois savoir faire (et au passage c'était requis pour ma première
solution aussi). Il faut aussi qu'il y ait toujours plus de n
espaces, et je suppose que n < 4.

2) Tu remplaces partout " {1,3}(?= {4}+[^ ])" par <TAB>.

3) Tu remplaces partout " {4}" par <TAB>.

Note que 2 et 3 peuvent être réunis en une seule étape :
2&3) Tu remplaces partout "( {1,3}(?= {4}+[^ ])| {4})" par <TAB>.



Ah... Je vais tester ça.

Merci

--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
xavier
Le #24101671
Marc Espie
Text::Tabs



Grmblbl. J'ai cherché partout, et je ne suis pas tombé sur celui-là.

J'essaye ça, merci

--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
xavier
Le #24101791
Xavier
Grmblbl. J'ai cherché partout, et je ne suis pas tombé sur celui-là.

J'essaye ça, merci



C'est impeccable. Juste que le module ne sait pas quoi faire des dernier
espaces, et les laisse.

Mais c'est pas grave, un s/t[ ]+/t/g; met tout d'équerre.

Thx

--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
Jean-Louis Morel
Le #24101851
Le 23/12/2011 18:40, Xavier a écrit :
Xavier
Grmblbl. J'ai cherché partout, et je ne suis pas tombé sur celui-là.

J'essaye ça, merci



C'est impeccable. Juste que le module ne sait pas quoi faire des dernier
espaces, et les laisse.

Mais c'est pas grave, un s/t[ ]+/t/g; met tout d'équerre.




Oui, mais si vous transformez les t en espaces pour ensuite réduire
les espaces en t, vous perdez la notion de colonnes séparées par t.
Si le texte comporte une série de 4 espaces successives par exemple,
vous allez avoir une colonne de plus, car ces 4 espaces vont être
transformées en t.

Personnellement, je préfèrerais utiliser t comme séparateur et comme
caractère de bourrage pour ensuite les réduire.

#!/usr/bin/perl
use strict;
use warnings;
use Text::Tabulate;

my $tabstop = 4; # valeur d'un t en caractères

my $tab = new Text::Tabulate();
$tab->configure(-tab => "t", gutter => "t", pad => "t");

# trois lignes pour tester
my @lines = (
"In your pomp andtall yourtglory you'ren",
"a poorer man than me,tas you lick the bootstofn",
"deathtborn out of fear.t(Jethro Tool)n"
);

my @out = $tab->format (@lines);
foreach (@out) {
s!(t+)!"t"x(length($1)/$tabstop+1)!eg;
}

print @out, "n";

__END__

Bon, je dis ça, mais c'est juste pour pinailler :-))

--
JL
http://www.bribes.org/perl
Olivier Miakinen
Le #24102031
Le 23/12/2011 18:40, Xavier a écrit :

Grmblbl. J'ai cherché partout, et je ne suis pas tombé sur celui-là.

J'essaye ça, merci



C'est impeccable. Juste que le module ne sait pas quoi faire des derniers
espaces, et les laisse.

Mais c'est pas grave, un s/t[ ]+/t/g; met tout d'équerre.



Plutôt s/t[ ]+/tt/g; non ?
Olivier Miakinen
Le #24102021
Le 23/12/2011 21:10, j'écrivais :

Mais c'est pas grave, un s/t[ ]+/t/g; met tout d'équerre.



Plutôt s/t[ ]+/tt/g; non ?



Ah non, ce sont les espaces qui restent si tes printf n'amenaient pas
chaque valeur sur un multiple de 4 ! Oui, ok.
Publicité
Poster une réponse
Anonyme