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 :

Utiliser un fichier INI


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut Utiliser un fichier INI
    Bonjour,
    Je cherche le moyen (le plus simple) pour utiliser un fichier INI du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [personne]
    nom=toto
    age=23
     
    [personne]
    nom=titi
    age=29
    pour ensuite, dans mon script principal, boucler sur toutes les sections [personne] et récupérer leur clé/valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    ini=conf.ini
    nb=`grep -o '\[personne\]' $ini | wc -l`
    for((n=1;n<=$nb;n++))
    do
    	echo "section n°"$n
    	echo "nom:" # récupérer le nom de la section n ?
    	echo "age:" # récupérer l'âge de la section n ?
    done
    merci d'avance !

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Bonjour

    Vu ta description, il faut t'orienter vers les fichiers xml. Et l'outil xmllint.

    Ce n'est pas un vrai fichier ini puisque tes catégories ont les mêmes noms.

    Si le but est vraiment de faire une chose simple, il faut t'orienter vers les fichiers csv (et l'outil awk). Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type;nom;age
    personne;toto;23
    personne;titi;29
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk -F';' '{print $2;}' fichier.csv
    nom
    toto
    titi

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Bonjour,

    Flodelarab a raison, c'est loin d'être intuitif d'utiliser des formats tel que le tient, d'ailleurs quels sont les spécificités immuables de celui-ci ?

    Si on prend, le fichier en exemple que tu donnes, on peut le traiter tel que ci-dessous, mais cela ne fonctionnera que dans ce cas précis ou l'on considère certaines spécificités de ton fichiers exemple dont tu ne parles pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    ini=conf.ini
    n=1
    while read -r -d ' ' attribut nom age || [[ -n $nom ]]
    do
            echo "section n°$((n++))"
            echo "nom: ${nom/*=/}" # récupérer le nom de la section n ?
            echo "age: ${age/*=/}" # récupérer l'âge de la section n ?
    done <$ini
    PS: Pas la peine de me demander une description du code, celui-ci n'est qu'un brouillon (comme ta demande ) qu'il ne faut surtout pas utiliser tel quel.

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    merci pour votre aide...

    Le format du fichier INI n'est pas figé...
    Je pense avoir besoin d'une dizaine de section "personne" ayant toutes les même propriétés mais avec valeurs différentes
    J'ai essayé avec CSV et AWK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom;age
    toto;23
    titi;29
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    csv=conf.csv
     
    traitement(){
    	echo "nom:"$1
    	echo "age:"$2
    }
     
    awk -F';' '{parcours $1 $2}' $csv
    Je n'arrive pas à utiliser ma fonction traitement()...
    un dernier coup de palme ?

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Voici un exemple en modifiant le script précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    ini=conf.ini
    n=1
    while IFS=";" read -r nom age || [[ -n "$nom" ]]
    do
            echo "section n°$((n++))"
            echo "nom: ${nom}" # récupérer le nom de la section n ?
            echo "age: ${age}" # récupérer l'âge de la section n ?
    done < <(sed '1d' $ini)
    ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat conf.ini
    nom;age
    toto;21
    titi;23
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ bash f.sh
    section n°1
    nom: toto
    age: 21
    section n°2
    nom: titi
    age: 23

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    ça semble marcher au poil...

    merci Flodelarab et disedorgue !

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Comme je te sens bien parti pour réinventer la roue, je signale que tout est faisable à l'intérieur de awk. C'est même fait pour.

    Voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ awk -F';' 'NR==1{for (i=1;i<=NF;i++) intitule[i]=$i; next;} {print "Section "(NR-1);for (i=1;i<=NF;i++) {print intitule[i]": "$i;} }' fichier.csv
    Section 1
    nom: toto
    age: 23
    Section 2
    nom: titi
    age: 29
    Si le côté uniligne t'aggresse, tu peux faire cela dans un script dont le shebang est #!/usr/bin/awk -f.

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Je ne connaissais pas le shebang #!/usr/bin/awk -f

    Ayant un traitement conséquent à chaque itération... je préfère pour le moment la solution while+sed

    Par contre, après 3H d'arrachage de cheveux, je tiens à revenir pour donner une indication importante concernant le format de fichier.
    Il faut vérifier que le fichier CSV soit en UNIX et pas DOS\WINDOWS car les retours chariots ne sont pas encodés pareils... ce qui provoque une erreur (de valeur récupérée) lorsque le dernier "champ" est vide.

    fichier UNIX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    col1;col2;col3[LF]
    a;b;c[LF]
    m;n;[LF]
    x;y;z
    fichier DOS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    col1;col2;col3[CR][LF]
    a;b;c[CR][LF]
    m;n;[CR][LF]
    x;y;z
    A l'itération m;n; :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "col3:"${col3}
    echo "col3:<"${col3}">"

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Dans le bout de code que je t'ai fourni, il suffit de modifier le sed pour qu'il prenne en compte le problème du UNIX/DOS:

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    roooooooh tu pouvais me dire ça avant... j'ai perdu tous mes cheveux !!!!
    merci disedorgue !

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Bah, c'était pas dans les specs et comme ça tu économises les sous du coiffeur

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2014, 11h05
  2. Utilisation TIniFiles (fichier ini)
    Par beni34 dans le forum Débuter
    Réponses: 11
    Dernier message: 14/04/2009, 18h23
  3. Utilisation de fichier ini
    Par nuFox dans le forum C
    Réponses: 32
    Dernier message: 04/03/2008, 14h48
  4. Pinguer plusieurs Ports en utilisant un fichier INI
    Par fthdz dans le forum Langage
    Réponses: 16
    Dernier message: 14/11/2007, 13h26
  5. Utiliser un fichier ini
    Par Sytchev3 dans le forum Langage
    Réponses: 3
    Dernier message: 14/08/2007, 17h48

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