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. #21
    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
    Ok je crois c'est la bétise que je fais depuis tt à l'heure. Je donne un exemple pour voir claire :

    J'ai l'information comme suis :

    0000010607100100634030010066338 JEAN GABIN 36 RUE LA BOETIE 0000000120203012007061420070522R F GSM OTAN 1000003024 001du2204au2105 07ECH1106N FACT9149935 R

    et j'aimerai avoir en sortie le format suivant :

    001,1000003024,,120203.01,20070709,CAB,SASM,9149935,120203.01

    Est-ce claire maintenant ?

    Merci d'avances.

  2. #22
    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
    Aaaah, on avance enfin. Je vois pour presque tous les champs sauf:

    1- 001 donnée fixe?
    2- 20070709 la date vient d'où? Fixe aussi

  3. #23
    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
    Effectivement, c'est des données statiques, et la date c'est la date système au format yyyymmdd.

    Je crois que t'as bien saisi mon souci que j'espère avoir une issue.

    Salutations.

  4. #24
    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.

    Alors, la difficulté est l'adresse de longueur variable et qui comporte des espaces qui posent problème. Tu n'en as pas besoin pour la sortie, on va donc s'en débarrasser ainsi que quelques champs inutiles. On va, au passage insérer des espaces pour isoler le montant à formater.

    Après sed, le /tmp/fichier-temporaire ressemblera à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     00000001202030 F GSM OTAN 1000003024 001du2204au2105 07ECH1106N  9149935
     00000001202030 F GSM OTAN 1000003024 001du2204au2105 07ECH1106N  9149935
     00000001202030 F GSM OTAN 1000003024 001du2204au2105 07ECH1106N  9149935
    Essaye ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # on met les locales à C pour avoir le point comme décimale (au cas où...)
    export LC_NUMERIC="C"
     
    # on sed pour présenter un fichier correct à awk qui met en forme
    sed -r 's/^.*( [0-9]{14})[0-9]+R (.*)FACT([0-9]+).*$/\1 \2 \3 /' f1 > /tmp/fichier-temporaire 
     
    # awk parse les champs et les mets en forme
    awk '{printf "001,%s,,%2.2f,20070709,CAB,SASM,%s,%2.2f\n", $5, $1/100, $8, $1/100}' /tmp/fichier-temporaire > fichier-de-sortie

  5. #25
    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 Ripat,

    Merci beaucoup pour tes conseils.

    J'aimerai seulement avoir quelques explications :

    - l'option -r de sed sert à quoi,
    - et c'est quoi f1 (mon fichier input_file ??)

    Salutations.

  6. #26
    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
    1- L'option -r est pour extended regex (voir man sed). Sans celle-ci le motif de remplacement devient, disons, indigeste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/^.*\( [0-9]\{14\}\)[0-9]\+R \(.*\)FACT\([0-9]\+\).*$/\1 \2 \3 /'
    2- oui, f1 est ton fichier de départ.

  7. #27
    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
    quand je lance avec l'option -r ca me donne le message d'erreur suivant :

    sed: illegal option -- r

    que dois-je faire ? ou existe il une autre option qui fait l amême chose ?

    Merci

  8. #28
    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
    C'est que ta version de sed ne supporte pas les ERE (Extended Regular Expression). Prends le motif que j'ai donné dans le post précédent. Il faut échapper les (){}?+ qui ont une signification spéciale en BRE (Basic RE). Moins lisible mais si tu n'as pas le choix...

  9. #29
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Sous certains Sed (en particulier sous BSD), c'est l'option -E à la place de -r.

  10. #30
    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 Tout le monde,

    Je crois que j'ai résolu le problème.

    J'ai utilisé cette combinaison qui m'as donner le résultat escompté.

    grep "^[0].*R *$" input_file | awk ' { printf "001,"substr($0,200,10)",," ; printf "%2.2f", substr($0,156,15)/100 ; printf "
    ,20070717,CAB,SASM,"substr($0,242,12)"," ; printf "%2.2f\n", substr($0,156,15)/100 }' >> output_file.

    Je vous remercie pour votre aide et conseils.

    Salutations.

  11. #31
    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 Tout le monde,

    Je crois que j'ai résolu le problème.

    J'ai utilisé cette combinaison qui m'a donner le résultat escompté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep "^[0].*R *$" input_file  | awk ' { printf  "001,"substr($0,200,10)",," ; printf "%2.2f", substr($0,156,15)/100 ; printf "
    ,20070717,CAB,SASM,"substr($0,242,12)"," ; printf "%2.2f\n", substr($0,156,15)/100 }'  >> output_file.
    Je vous remercie pour votre aide et conseils.

    Salutations.

  12. #32
    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
    Bonjour Ripat,

    J'aimerai une dernière chose :

    maintenant que j'ai mon fichier de sortie comme ceci :

    H,070717,
    001,1000003024,,120203.01,20070717,CAB,SASM,9149935,120203.01
    001,1000012664,,3020.01,20070717,CAB,SASM,9184652,3020.01
    001,1004482779,,2020.02,20070717,CAB,SASM,9290712,2020.02
    001,1000704527,,1020.01,20070717,CAB,SASM,9335245,1020.01
    001,1000016863,,120201.01,20070717,CAB,SASM,9185256,120201.01
    001,1000197795,,2020.01,20070717,CAB,SASM,9318072,2020.01
    001,1025352795,,120202.01,20070717,CAB,SASM,9290703,120202.01
    001,1002435926,,1020.02,20070717,CAB,SASM,9310428,1020.02
    001,1004484227,,4020.01,20070717,CAB,SASM,9224595,4020.01
    T,1.06808e+06,9

    La dernière ligne représente le total où le T (Total) et le 9 pour le nombre d'itération (la ou il ya le 001 au debut)

    Seulement la somme des montant (en gras rouge) n'est pas bien affiché, je veuw qu'il m'affiche la somme tel que 373726.11


    pour cela j'utilise la formule suivante :

    grep "^0" |awk -F "," '{total += $4}; END {print "T,"total ","NR }' >tmp_file.txt

    Y a t-il un moyen pour régler ce problème ?.

    Merci mille fois.

  13. #33
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par arezki76
    Je veux qu'il m'affiche la somme tel que 373726.11
    pour cela j'utilise la formule suivante :

    grep "^0" |awk -F "," '{total += $4}; END {print "T,"total ","NR }' >tmp_file.txt
    Y a t-il un moyen pour régler ce problème ?.
    Merci mille fois.

    %.2f : valeur numérique avec 2 décimales

    grep "^0" |awk -F "," '{total += $4}; END {printf("T,%.2f,%d\n",total,NR) }' >tmp_file.txt

  14. #34
    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,

    Je vous remercie infiniment, c'est résolu maintenant, et pourtant j'avais la solution sous mon nez.

    il fallait juste faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F "," '{total =total+$5}; END {printf "T," ; printf "%2.2f",total ; printf ","NR }' >tmp_file.txt

    Merci et bonne continuation à tous.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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, 18h54
  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, 17h15
  3. Conversion chaine de caractères en nombre décimal
    Par lodan dans le forum Langage
    Réponses: 3
    Dernier message: 02/04/2009, 20h11
  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, 12h20
  5. conversion chaine de caractères --> HTML
    Par captainflex dans le forum Ruby on Rails
    Réponses: 9
    Dernier message: 17/06/2007, 22h37

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