Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/07/2011, 09h18   #1
Membre du Club
 
Inscription : décembre 2008
Messages : 179
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 179
Points : 51
Points : 51
Par défaut Variable de longueur fixe

Bonjour,

Pour un échange de données avec un client j'ai besoin de générer un fichier de stock.
Les prérequis sont définis et il faut plusieurs données dans un fichier texte.
Le fichier sera impérativement en longueur fixe sans séparateur.
Par exemple le premier champ dois être un numéro incrémental mais le champ doit être de longueur fixe (17 caractères).
Si par exemple mon numéro est 1234 il faut que je complète ce numéro par des espace pour que j'arrive à 17 caractères au total.

Je ne sais pas du tout comment procéder, j'ai fait quelques recherches mais sans trouver.
Auriez vous une commande magique pour faire cela ?
tiamat59 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/07/2011, 09h56   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Bonjour,

Citation:
Envoyé par tiamat59 Voir le message
Le fichier sera impérativement en longueur fixe sans séparateur.
Par exemple le premier champ dois être un numéro incrémental mais le champs doit être de longueur fixe (17 caractères).
Sans séparateur cela risque d'être assez ardu

A défaut peut-on avoir la nature de chaque champ (chiffres, lettres, etc.) ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/07/2011, 10h11   #3
Membre du Club
 
Inscription : décembre 2008
Messages : 179
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 179
Points : 51
Points : 51
Et bien j'aurais les 2, des lettres et des chiffres.

Par exemple une de mes fonctions est de compter le nombre de lignes d'un ficher.
Donc par exemple j'obtiens 12 lignes
ce chiffre 12 je dois le mettre dans un nouveau fichier et le combler de 4 espaces pour que la longueur soit de 6.


J'ai commencé des test en faisant cela mais ça ne fonctionne pas et je me vois mal faire ce test à chaque chaine à ajouter.
Code :
1
2
3
4
5
6
7
8
 
nbl="abcd"
until test [${#nbl} -ne 6]
do
nbl=$nbl" "
done
 
echo nbl
tiamat59 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/07/2011, 10h33   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Ok, c'est plus clair

Un exemple parmi d'autres sûrement... j'ai mis un tiret pour une meilleure visualisation, à remplacer par ce que tu veux :

Code :
1
2
3
4
5
6
7
8
9
10
11
$ A=12

$ echo $A
12

$ A=$(echo "$A" | sed ':z;s/^.\{1,5\}$/&-/;tz')

$ echo $A
12----

$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/07/2011, 10h35   #5
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 536
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 536
Points : 7 749
Points : 7 749
utiliser des longueur fixes n'est pas nécessairement une mauvaise idée en soit, mais vu le besoin, ne serait il pas plus malin d'utiliser une variable de type tableau tout simplement pour 1 case 1 donnée tu traites ainsi sans te soucier de compter les longueurs à chaque traitement, ça évitera les erreurs, et lenteurs.

une fois les données traitées, là tu mets en forme une seule fois chaque ligne du tableau obtenu dans un fichier que tu échangeras avec ton client.

C'est beaucoup plus souple et surtout si les besoins évoluent ou autre... ce sera modifiable.

var[1]=truc
var[2]=45
var[..]=...
var[x]=treter


et après tu mets en forme
ça permettra aussi de tester chaque valeurs indépendamment, d'arrondir si nécessaire les valeurs chiffrées, de découper si nécessaire les données textuelles etc.... bref de faire un vrai contrôle d'erreur avant d'envoyer ton fichier au client.

et oui effectivement là tu peux te passer totalement de séparateur.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 11h07   #6
Membre du Club
 
Inscription : décembre 2008
Messages : 179
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 179
Points : 51
Points : 51
Merci pour cette fonction zipe31

Par contre pour les tableaux je ne pense pas que ce soit nécessaire car sur mon fichier sans séparateur il n'y a qu'un ligne en faite.
J'ai un deuxième fichier qui aura lui plein de lignes mais d'après la doc du client lui il aura des séparateurs |, j'ai demander confirmation.
En plus les tableaux en sh je ne sais pas trop les utiliser mais a voir.
De toute façon sur le traitement existant que je dois adapter à cette situation le deuxième fichier lui est traité en php (langage que je maitrise beaucoup mieux) donc je crois que je ne serai plus bloqué.

Merci pour votre aide.
Je laisse le sujet un peu ouvert pour l'instant, j'aurais peut être d'autre questions bientôt sur le sujet .
tiamat59 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/07/2011, 11h15   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

Code BASH :
1
2
3
var=1234
printf "%-17s<-par exemple\n" $var
1234             <-par exemple
ouf!
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 29/07/2011, 14h39   #8
Membre du Club
 
Inscription : décembre 2008
Messages : 179
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 179
Points : 51
Points : 51
Je viens de me rendre compte que la partie sh du script qui générait cette ligne en fait ne fonctionnait pas et cela était doublé dans le php (ce qui est complétement con, il aurait pu effacer la partie sh si elle ne servait pas) enfin bref.

En faite il me faudrait la même chose mais en php.
Je sais que ce n'est pas le bon forum mais je tente quand même on ne sait jamais.
tiamat59 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/07/2011, 14h44   #9
Membre du Club
 
Inscription : décembre 2008
Messages : 179
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 179
Points : 51
Points : 51
trouvé avec str_pad
tiamat59 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h08.


 
 
 
 
Partenaires

Hébergement Web