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 :

Découpage chaines caractère (une ligne csv)


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 54
    Points : 76
    Points
    76
    Par défaut Découpage chaines caractère (une ligne csv)
    Bonjour,

    Pouvez vous m'aider à découper une chaîne de caractère :

    J'ai des valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    export datas="valeur1;valeur2;valeur3;valeurN"
     
    donnes=$(echo $datas | awk -F ";" '{print $1}')
     
    val1=$(echo $datas | awk -F ";" '{print $2}')
    val2=$(echo $datas | awk -F ";" '{print $3}')
     
    echo "$donnes  $val1  $val2"

    j'ai bien tout les valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur1  valeur2  valeur3
    mais j'aimerais une boucle de façon dynamique de détecter automatiquement avec "for"

    Il y a t une autre solution pour faire cette boucle ?


    Merci pour votre aide !!

    Bonne journée

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -F";" '{ print NF }'

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 54
    Points : 76
    Points
    76
    Par défaut
    Merci mais comment je fais pour renvoyer les valeur NF dans chaque variable différent ?

  4. #4
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat fichier.truc.machin.123.csv | awk -F ";"  '{ for(i=0; i<NF ; i++ ) print $i } '

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IFS=';' read donnes val1 val2 <<< "${datas}"
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 54
    Points : 76
    Points
    76
    Par défaut
    Merci beaucoup pour les deux solution

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    bonjour,

    j'aimerais une boucle de façon dynamique de détecter automatiquement avec "for"
    détecter quoi ?

    pourquoi awk ?
    bash peut probablement le faire sans le recours à un programme externe. mais faire quoi ??? !

    EDIT: si il y a un grand nombre de champs, ou si ce nombre est inconnu ou variable, utilise un tableau.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Juste pour le fun (ne pas utiliser) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ foo="val1;val2;val3"
    $ i=0
    $ eval declare bar\$\(\(i++\)\)=${foo//;/ bar\$((i++))=}
    $ echo $bar0
    val1
    $ echo $bar1
    val2
    $ echo $bar2
    val3
    Cordialement.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    ne pas utiliser

    en gros, en gras, souligné, et en rouge.
    sinon on risque de passer à côté.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Et celle-ci, peut-on l'utiliser ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ foo="val1;val2;val3"
    $ printf -vfoo '%q' "$foo"
    $ i=0
    $ eval declare bar\$\(\(i++\)\)=${foo//\\;/ bar\$((i++))=}
    $ echo $bar0
    val1
    $ echo $bar1
    val2
    $ echo $bar2
    val3
    Bien sur, merci d'argumenter votre réponse (surtout si c'est non pour des raisons de sécurité)
    Cordialement.

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    je reprends ce que tu dis.

    ça me semble toujours bizarre, même "pour le fun", de proposer de trucs à ne pas utiliser.

    « on peut passer à l'orange, mais, chut, il ne faut pas le faire. »
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Oui, je suis d'accord, dans le principe, on ne doit pas utiliser des solutions borderline quand une solution clean existe, mais de les montrer peut permettre aux autres de comprendre certaines astuces qui peuvent elles être utilisées ailleurs.

    Par exemple ici, dans la solution proposée, on peut voir comment se protéger de certains effet de bord grâce au printf '%q' et si on décortique la ligne 'eval', on comprendrait que celui-ci n'est là que pour l'incrément lors de la fabrication de variable via declare (sans parler de la substitution).

    Après, il est vrai que beaucoup ne font qu'attendre la solution sans chercher à prendre le temps de comprendre tout ça.

    Et c'est bien dommage, car lorsque l'on comprend les cas limites d'un langage, on acquière, en général, une meilleure expertise d'utilisation de celui-ci.
    Cordialement.

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    c'est bar bar , utilise un tableau.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. importer le 0 d'une ligne csv
    Par olivphp dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 10/10/2017, 14h35
  2. Recherche plusieurs chaines dans une ligne
    Par emmachane dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 30/05/2011, 17h14
  3. Réponses: 2
    Dernier message: 13/11/2008, 13h38
  4. Réponses: 4
    Dernier message: 10/07/2008, 13h34
  5. Découpage dynamique d'une chaine de caractère
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 18h49

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