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

Formatage texte a partir d'un tableau

4 réponses
Avatar
ctemp1
Bonjour,

J'ai un tableau à 2 dimensions du style :

@tab =(
["Un", 1, 2, 3, 4, undef, undef, undef],
["Deux, 5, 6, 7, undef, undef, undef, undef],
);

Je voudrais sortir ces résultats dans un fichier mais avec un
formatage, par exemple :

Un : 1 et 2 soit 3 et 4 pourcents Deux : 5 et 6 soit 7 pourcents
Trois : 5 et 9 soit 15 pourcents Quatre : 58 et 14 soit 85
pourcents
...

J'avais pensé à faire une double boucle :
for(i=0 i<20 i++)
for (j=0 j<20 j++)
ecrire avec printf chaque element

Mais je ne vois pas comment organiser ma boucle comme ca, et de plus
il affiche les undef (j'ai mis des undef car avec des lignes de
différentes tailles j'ai une erreur avec les 2 boucles du haut avec la
taille fixe <20).
A ce propos y a-il un moyen de faire une boucle dans ce style qui lise
chaque ligne jusqu'au dernier élement ?

Si vous pouviez m'indiquer une méthode pour formater un sortie de
tableau, ce serait sympa.

Merci.

C. Tobini

4 réponses

Avatar
jl_morel
Dans l'article ,
.fr a dit...
J'ai un tableau à 2 dimensions du style :

@tab =(
["Un", 1, 2, 3, 4, undef, undef, undef],
["Deux, 5, 6, 7, undef, undef, undef, undef],
);

Je voudrais sortir ces résultats dans un fichier mais avec un
formatage, par exemple :

Un : 1 et 2 soit 3 et 4 pourcents Deux : 5 et 6 soit 7 pourcents
Trois : 5 et 9 soit 15 pourcents Quatre : 58 et 14 soit 85
pourcents
...

J'avais pensé à faire une double boucle :
for(i=0 i<20 i++)
for (j=0 j<20 j++)
ecrire avec printf chaque element

Mais je ne vois pas comment organiser ma boucle comme ca, et de plus
il affiche les undef (j'ai mis des undef car avec des lignes de
différentes tailles j'ai une erreur avec les 2 boucles du haut avec la
taille fixe <20).
A ce propos y a-il un moyen de faire une boucle dans ce style qui lise
chaque ligne jusqu'au dernier élement ?



Pas besoin d'ajouter des 'undef' pour compléter les listes.
Si j'ai bien compris le format demandé, on peut faire par exemple :

#!/usr/bin/perl -w
use strict;

my @tab =(
["Un", 1, 2, 3, 4],
["Deux", 5, 6, 7],
["Trois", 8, 9],
["Quatre", 10]
);

foreach (@tab) {
my $s = shift(@$_)." : ";
while (@$_>1) {
$s .= join ' et ', splice @$_, 0, 2;
$s .= ' soit ' if @$_;
}
$s .= "$$_[0]" if @$_;
print "$s pourcentsn";
}

__END__

HTH

--
J-L.M.

Avatar
ctemp1
Bonjour et merci beaucoup pour votre exemple.

En tant que débutant en Perl elle m'a fait un peu cogiter :)

Apparement il y a beaucoup de manières de mettre en forme du texte en
Perl.

En fait pour ce que cherche a faire, le formatage en texte simple
n'est pas suffisant et je pensais me mettre au CGI pour pouvoir faire
une mise en forme sur tableau.

Pourriez-vous me dire s'il existe d'autres modules pour la mise en
forme ? Ne souhaitant pas impérativement avoir une mise en forme en
HTML, y a-t-il moyen de jouer sur la mise en forme de documents textes
(système de colonnes...) ?

Par exemple, si je dispose de plusieurs tableaux de tailles variables,
puis-je faire en sorte qu'ils soient 3 par ligne en sortie d'un
fichier texte ?

Par ex:

Un 2 et 3 Deux 3 et 4 Trois 8 et 9
1 et 5 8 et 4 5 et 6

Car s'il est certainement possible en jouant sur les indices de faire
un tel placement, je ne sais pas comment faire en sorte que les
chiffres soiet parfaitement alignés.

Merci.

C. Tobini
Avatar
jl_morel
Dans l'article ,
.fr a dit...
[couic]

Pourriez-vous me dire s'il existe d'autres modules pour la mise en
forme ? Ne souhaitant pas impérativement avoir une mise en forme en
HTML, y a-t-il moyen de jouer sur la mise en forme de documents textes
(système de colonnes...) ?

Par exemple, si je dispose de plusieurs tableaux de tailles variables,
puis-je faire en sorte qu'ils soient 3 par ligne en sortie d'un
fichier texte ?

Par ex:

Un 2 et 3 Deux 3 et 4 Trois 8 et 9
1 et 5 8 et 4 5 et 6

Car s'il est certainement possible en jouant sur les indices de faire
un tel placement, je ne sais pas comment faire en sorte que les
chiffres soiet parfaitement alignés.



Vous pouvez utiliser une sortie formatée; voir perlform :
http://www.bribes.org/perl/docfr/perlform.html

Il existe une foultitude de modules pour faire des tableaux.

* Text::FormatTable :
http://cpan.uwinnipeg.ca/htdocs/Text-FormatTable/Text/FormatTable.html

* Text::Table :
http://cpan.uwinnipeg.ca/htdocs/Text-Table/Text/Table.html

* Text::TabularDisplay :
http://cpan.uwinnipeg.ca/htdocs/Text-TabularDisplay/Text/TabularDisplay.html

...etc

Pensez à utiliser le CPAN :
http://cpan.uwinnipeg.ca/search?query=table&mode=dist

HTH

--
J-L.M.

Avatar
ctemp1
Merci beaucoup pour ces infos, j'ai récupéré pas mal de modules que
j'ai essayé mais ca ne convient pas à ce que je voudrais, je pense
essayer de passer les sorties de tableaux en CGI.

Le formatage texte semble très utile mais trop basique pour des
tableaux à dimension variable, à moins que l'on puisse fixer une
dimension de cellules unique pour chaque sortie, puis utiliser le
module d'alignement pour formater le texte à l'intérieur des cellule.
Autrement la sortie n'est pas propre.