Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/11/2012, 13h56   #1
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 515
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 515
Points : 32
Points : 32
Par défaut variable dans tableau

Bonjour,

J'ai un certain nombre de variable que je souhaiterai placé sur une ligne dans un fichier, mais dans des positions prédéfinis.

exemple :
Citation:
my $va1=45689;
my $va2=dupont;
my $va3=15612345;
Je souhaiterai le résultat de ces variables soit dans un fichier comme l'exemple ci-dessous :
45689 dupont 15612345

Entre les variables, je veux mettre un certain nombre d'espace, entre le 9 et d, je souhaiterai 4 blanc.
Entre t et 1, 8 blancs.

En sachant que le premier caractére de ma variable $va3, doit toujours être en position 23. Ma variable $2, en position 9.......

Comment puis je faire ?
vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 18h58   #2
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 588
Points : 1 152
Points : 1 152
Déclare des variables comportant les espaces:
Code :
my ($sp4, $sp8) = ("    ", "        ");
ou bien:

Code :
1
2
my $sp4 = " " x 4;
my $sp8 = " " x 8;
Ensuite:

Code :
my $ligne = $var1 . $sp4 . $var2 . $sp8 . $var3 . "\n";

Ou encore par interpolation directe dans une chaîne de caractères:

Code :
my ligne = "$var1    $var2        $var3\n";
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 06h41   #3
elvivo
Membre régulier
 
Avatar de elvivo
 
Inscription : mai 2002
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 105
Points : 71
Points : 71
Il semble que tu souhaite rendre tes donnees au dans un format fixed-width.
Dans ce cas tu devrait utiliser pack, particulierement bien adapte a ce genre de fonction:
Code :
1
2
3
4
5
6
7
 
use strict;
use warnings;
 
my @row = (45689, 'dupont', 15612345);
my $out = pack "A9A14A10", @row;
print "$out\n";
Tu as preciser que le premier et le second champ devaient toujours faire 9 et 14 characteres mais tu n'as rien dit pour le dernier donc j'ai mis 10 histoire que ca tienne. Tu n'as qu'a remplacer par la taille que tu desires.
__________________
In code we trust !!
elvivo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 19h06   #4
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 515
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 515
Points : 32
Points : 32
Je pense que je me suis mal exprimé dans ma demande.

En fait, je dois créer une ligne qui ne dépasse pas 160 caractéres. Chaque zone correspond à des données bien définis.

Par exemple
Le matricule sur 5 caractéres, doit être en position 1.
Le Nom de la personne sur 20 caracteres maximum doit etre en position 6.
le prenom de la personne sur 10 caracters en position 26.

Comment puis je faire, en sachant que par exemple pour le nom, il peut y avoir que 10 caractéres, donc le reste serait combler par des blancs.

Merci
vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 20h48   #5
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 588
Points : 1 152
Points : 1 152
La fonction pack proposée par Elvivo ajoutera les caractères de bourrage nécessaires. Sinon, il y a aussi la fonction sprintf qui peut faire la même chose, mais ce sera souvent un peu plus compliqué. Et aussi la fonction format, plus orientée format de la ligne complète.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 21h32   #6
elvivo
Membre régulier
 
Avatar de elvivo
 
Inscription : mai 2002
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 105
Points : 71
Points : 71
Disons que pack pour de l'ascii c'est simple pour des formats plus exotics ca peur devenir assez tordu
Sinon il te suffit d'adapter la solution que j'ai donner en modifiant les tailles que j'ai mis. Chaque nombre dans le premier argument de pack represent la taille d'un champ donc il te suffit de changer pour coller au format final.
__________________
In code we trust !!
elvivo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 12h30   #7
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 515
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 515
Points : 32
Points : 32
merci pour ta solution, je vais essayer de me débrouiller.
vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h49.


 
 
 
 
Partenaires

Hébergement Web