Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tabulations dans printf

8 réponses
Avatar
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 ?

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)

8 réponses

Avatar
Olivier Miakinen
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
Avatar
espie
In article <1kcqizh.1cb51of1obe97iN%,
Xavier wrote:
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
Avatar
xavier
Olivier Miakinen <om+ wrote:

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)
Avatar
xavier
Marc Espie wrote:

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)
Avatar
xavier
Xavier wrote:

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)
Avatar
Jean-Louis Morel
Le 23/12/2011 18:40, Xavier a écrit :
Xavier wrote:

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
Avatar
Olivier Miakinen
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 ?
Avatar
Olivier Miakinen
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.