IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Conversion chaine de caractères en numérique


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut Conversion chaine de caractères en numérique
    Bonjour,

    Pourrai je faire la conversion d'une chaine de caractères en un numerique
    exemple :

    0000102031 en 1020.31


    Salutations.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Bonjour.

    Bash est très pauvre dès qu'il s'agit de faire des opérations mathématiques sur des réels. Il faut faire appel à la librairie bc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'scale=2; 0000102031 / 100' | bc
    en hsh, qui supporte l'arithmétique des nombres flottants, c'est plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%.2f' $((0000102031/100))

  3. #3
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut conversion d'une chaine de caractères en numerique
    Bonjour,

    Le truc est que dans mon script, je récupère des informations avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     grep "^[0].*R *$" final_file  | awk  ' { print "001,"substr($0,200,10)",,"substr($0/100,156,13)"."substr($0,169,2)
    où le fichier final_file contient des lignes de la forme :

    0000010607100100634030010066338 xxxxx xxxxx xxxxxxxxxxxxxxxxxxxxxxx
    0000000120203012007061420070522R F BBB BACS 1000003024 001du2204au2105 07ECH1106N FACT9149935
    le montant est ce qui est gras et souligné

    pourrai je utiliser ce que tu m'as donner pour extraire cette l'information ?

    Merci d'avance

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    tu peux utiliser la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${ligne:$position:$longueur}
    pour extraire une sous chaîne sans passer par awk.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $bla=123456789
    $echo ${bla:1:3}
    234
    Attention, c'est en bash.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut Conversion chaine de caractères en numérique
    Bonjour;

    Effectivement ceci marche, mais le hic c'est que le nombre de 0 à gauche n'est pas fixe, et je peux pas connaitre la position ou commence le montant.

    Salutations.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Donnes-nous plusieurs lignes typiques et représentatives de toutes les formes possibles. Sinon, on risque de tourner en rond.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut chaine de caractères en numérique
    Bonjour,

    Ci-joint un echantillon de lignes en question :

    0000030607100400142410037951162 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120205042007062620070605R.F.GSM.OTAN°1000015641+001du0805au0706/07ECH2606N.FACT9184832
    0000040607100400101415102251141 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000001020042007062620070605R.F.GSM.OTAN°1000045820+001du0805au0706/07ECH2606N.FACT9153642
    0000050607102700707010220300101 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000002020272007062620070605R.F.GSM.OTAN°1000542479+001du0805au0706/07ECH2606N.FACT9303488
    0000060607100200082820820573567 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120202022007062620070605R.F.GSM.OTAN°1002425015+001du0805au0706/07ECH2606N.FACT9130555
    0000070607102100008115000071447 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120203212007062620070605R.F.GSM.OTAN°1002575080+001du0805au0706/07ECH2606N.FACT9142089
    0000080607100500111415000013029 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000001020052007062620070605R.F.GSM.OTAN°1004003322+001du0805au0706/07ECH2606N.FACT9233434
    0000090607102700707010147400139 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120202272007062620070605R.F.GSM.OTAN°1003089445+001du0805au0706/07ECH2606N.FACT9303489
    0000100607102700795010031000104 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120203272007062620070605R.F.GSM.OTAN°1003358048+001du0805au0706/07ECH2606N.FACT9303490
    0000110607102700707010283800181 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120201272007062620070605R.F.GSM.OTAN°1003825346+001du0805au0706/07ECH2606N.FACT9303491
    0000120607102700707010280100116 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000001020272007062620070605R.F.GSM.OTAN°1008214891+001du0805au0706/07ECH2606N.FACT9079384
    0000130607102100007113000012686 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000003020212007062620070605R.F.GSM.OTAN°1010584225+001du0805au0706/07ECH2606N.FACT9219325
    0000140607102605301000045450080 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120203262007062620070605R.F.GSM.OTAN°1011543345+001du0805au0706/07ECH2606N.FACT9220305
    0000150607102100005115000307404 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000002020212007062620070605R.F.GSM.OTAN°1012019059+001du0805au0706/07ECH2606N.FACT9136190

    où ce qui est en gras représente le montant que je veux mettre sous forme numérique.

    Salutations.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Avant d'aller plus loin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0000150607102100005115000307404 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    0000000002020212007062620070605R.F.GSM.OTAN°1012019059+001du0805au0706/07ECH2606N.FACT9136190
    est sur une seule ligne ou tu l'as coupée pour ton post?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0000150607102100005115000307404 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000002020212007062620070605R.F.GSM.OTAN°1012019059+001du0805au0706/07ECH2606N.FACT9136190

  9. #9
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut chaine de caractères en numérique
    Bonjour,

    Oui le tout est sur une seule ligne.

    J'ai utilisé awk avec substr mais le résultat n'est pas ce que je voulais.

    Salutations.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    awk était la bonne piste.

    Essaye ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk '{ printf "%2.2f\n", substr($3,0,15)/100}' ton-fichier

  11. #11
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut Conversion chaine de caractères en numérique
    Bonjour,

    En l'executant sur le champ seul ça marche.

    J'aimerai bien comment l'inscruter au milieu comme le montre ma commande suivante :

    grep "^[0].*R *$" old_file | awk ' { print "001,"substr($0,200,10)",,"ICI",AAA,ITS,TABS,"substr($0,242,12)","substr($0,15
    6,13)"."substr($0,169,2) }' >> new_file de tel sorte a avoir comme sortie une ligne du genre :

    001,xxxxxxxxxx,,120203.01,20070709,XXX,XXXX,9149935,120203.01

    où ce qui est en rouge la formule que tu m'as donné.

    Merci d'avance.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Si ton "old_file" est celui dont tu as donné un extrait plus haut, pas besoin de filtrer avec grep. De plus on peut filtrer avec awk si nécessaire.

    S'il s'agit d'un tout autre fichier, donne-nous un extrait explicite pour voir.

  13. #13
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut chaine de caractères en numérique
    l'extrait donné n'est pas celui de mon old_file.

    j'ai pu le faire mais le résultat n'est pas sur une seul ligne comme je le voulais.

    j'ai utiliser cette ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep "^[0].*R *$" input_file  | awk ' { printf "%s" "001,"substr($0,200,10)",," ; printf "%2.2f", substr($0,156,15)/100 ; print ",AAA,BBB,CCCC,"substr($0,242,12)"," ; printf "%2.2f\n", substr($0,156,15)/100 }'  >> output_file.
    j'ai lancer cette combinaison sur des lignes du genre transmi ultérieurement.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Tant que tu ne donnes pas d'extrait représentatif de ton old-file et du format de sortie souhaité, on ne va pas pouvoir t'aider beaucoup.

  15. #15
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut chaine de caractères en numérique
    je peux te donner ya aucun problème :

    0000010607100100634030010066338 XXXXX XXXXX 36 RUE XXXXXXXXXXXXXXXX
    0000000120203012007061420070522R F XXX XXXX 1000003024 001du2204au2105 07ECH1106N FACT9149935
    R
    0000020607100100617030010071941 XXXXXXXXXX XXXXXX 4 RUE XXXXXXXXXXXXXXXXXXX
    0000000003020012007061420070522R F GSM OTAN 1000012664 001du2204au2105 07ECH1106N FACT9184652
    R
    0000060607100200082820820573567 XXXXXXXX XXXXXX AVENUE XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    DES 0000000120202022007061420070522R F GSM OTAN 1002425015 001du2204au2105 07ECH1106N FACT9130555
    202
    0000260607100200082820826078220 XXXX XXXXXXXX XXXXXXXXXXXXXX
    0000000120002022007061420070522R F GSM OTAN 1004000012 001du2204au2105 07ECH1106N FACT9290703
    002
    0000270607100200012120325768947 XXXXXX XXXXXX 294 Bd XXXXXXXXXXXXXXX
    0000000002020022007061420070522R F GSM OTAN 1004482779 001du2204au2105 07ECH1106N FACT9290712
    R

    J'espère que cela vous aidera.

    Merci d'avance.

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    OK, ton fichier d'entrée ressemble à ce qu tu as donné plus haut. Tu cherches à traiter les seules lignes contenant [0-9]*R mais que veux-tu comme format de sortie. Les mêmes lignes avec le champ numérique reformaté? Le seul champ reformaté? Donne un exemple.

  17. #17
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut chaine de caractères en numérique
    j'ai donner un exemple plus haut je crois, et j'ai mis en gras le format de la donnée que je veux avoir.

    Merci.

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Ce que tu as mis en gras plus haut est le format du fichier d'entrée non?

    Si je devine bien ce que tu veux, c'est transformer:
    0000030607100400142410037951162 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0000000120205042007062620070605R.F.GSM.OTAN°1000015641+001du0805au0706/07ECH2606N.FACT9184832
    en

    0000030607100400142410037951162 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 120205.042007062620070605R.F.GSM.OTAN°1000015641+001du0805au0706/07ECH2606N.FACT9184832
    C'est ça?

  19. #19
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 56
    Points
    56
    Par défaut chaine de caractères en numérique
    oui vous m'avez compris, seulement la ligne en sortie est de la forme :


    001,xxxxxxxxxx,,120205.04,20070709,XXX,XXXX,9149935,120205.04

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Bon,

    1- si tu remplaces ton exemple de sortie par des x, on ne vois pas quel champs tu veux récupérer.

    2- tes champs du fichiers d'entrée sont-il de longueur fixe? J'ai cru voir que tes séparateur de champs (fichier entrée) ne sont pas uniformes. L'adresse comporte aussi des espaces qui pourraient être confondus avec les séparateurs.

    3- quel champ date veux-tu récupérer (il y en a 4 à première vue)

    Bref, modélise ta question avec un exemple bidon mais représentatif (sans xxx!) sinon, on a pas fini de tourner en rond! Mets-toi à la place des membres de ce forum qui n'ont jamais vu tes fichiers ni peuvent deviner à quoi doit ressembler la sortie.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. conversion chaine de caractères en numérique
    Par mainak29 dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/01/2012, 17h54
  2. Conversion chaîne de caractère/valeur numérique
    Par julieng31 dans le forum Débuter
    Réponses: 5
    Dernier message: 03/06/2009, 16h15
  3. Conversion chaine de caractères en nombre décimal
    Par lodan dans le forum Langage
    Réponses: 3
    Dernier message: 02/04/2009, 19h11
  4. Conversion chaine de caractère => entier (ordre des caractères primordial car ADN)
    Par ctobini dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/09/2007, 11h20
  5. conversion chaine de caractères --> HTML
    Par captainflex dans le forum Ruby on Rails
    Réponses: 9
    Dernier message: 17/06/2007, 21h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo