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 POSIX Discussion :

AWK - génération fichier xml à partir de fichier csv


Sujet :

Shell et commandes POSIX

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut AWK - génération fichier xml à partir de fichier csv
    Bonjour,

    Je débute et on me demande à partir d'un fichier CSV "parent.csv" de générer un fichier xml "parent.xml" en utilisant awk
    Je ne parviens pas à afficher les informations relatives aux enfants

    Fichier "parent.csv"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dupont;Paris;France;Martin;5;Axelle;12;Quentin;3;
    Durant;Marseille;France;Theo;5;
    Martin;Lyon;France;Leon;2;Ariane;1;
    Fichier "parent.xml" qui doit être généré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <Rapport>
      <Famille>
        <Nom - "Dupont" />
        <Lieu - Ville:"Paris" - Pays:"France" />
        <Enfants>
          <Enfant - Prenom:"Martin" - Age:5 />
          <Enfant - Prenom:"Axelle" - Age:12 />
          <Enfant - Prenom:"Quentin" - Age:3 />
        </Enfants>
      </Famille>
      <Famille>
        <Nom - Durant />
        <Lieu - Ville:"Maresille" - Pays:"France" />
        <Enfants>
          <Enfant - Prenom:"Theo" - Age:"5" />
        </Enfants>
      </Famille>
      <Famille>
        <Nom - "Martin" />
        <Lieu - Ville:"Lyon" - Pays:"France" />
        <Enfants>
          <Enfant - Prenom:"Leon" - Age:"2" />
          <Enfant - Prenom:"Ariane" - Age:"1" />
        </Enfants>
      </Famille>
    </Rapport>


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    awk -F, '{
       if(NR==1){print "<Rapport>"};
       split($0,array,";");
       {print "\t<Famille>"};
       {print ("\t\t<Nom - \042"array[1]"\042 />")};
       {print ("\t\t<Lieu - Ville:\042"array[2]"\042 - Pays:\042"array[3]"\042 />")};
       {print "\t\t<Enfants>"};
       {print "\t\t</Enfants>"};
       {print "\t</Famille>"}
    }
       END{print "</Rapport>"}' parent.csv > parent.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $ more parent.xml
    <Rapport>
            <Famille>
                    <Nom - "Dupont" />
                    <Lieu - Ville:"Paris" - Pays:"France" />
                    <Enfants>
                    </Enfants>
            </Famille>
            <Famille>
                    <Nom - "Durant" />
                    <Lieu - Ville:"Marseille" - Pays:"France" />
                    <Enfants>
                    </Enfants>
            </Famille>
            <Famille>
                    <Nom - "Martin" />
                    <Lieu - Ville:"Lyon" - Pays:"France" />
                    <Enfants>
                    </Enfants>
            </Famille>
    </Rapport>

    Je ne parviens pas à afficher les enfants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    awk -F, '{
       if(NR==1){print "<Rapport>"};
       split($0,array,";");
       {print "\t<Famille>"};
       {print ("\t\t<Nom - \042"array[1]"\042 />")};
       {print ("\t\t<Lieu - Ville:\042"array[2]"\042 - Pays:\042"array[3]"\042 />")};
       {print "\t\t<Enfants>"};
       for (i = 4; i <= NF; i+=2) {
          print ("\t\t\t<Enfant - Prenom:\042"array[i]"\042 - Age:\042"array[i+1]"\042 />")
       };
       {print "\t\t</Enfants>"};
       {print "\t</Famille>"}
    }
       END{print "</Rapport>"}' parent.csv > parent.xml
    ==> ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $ more parent.xml
    <Rapport>
            <Famille>
                    <Nom - "Dupont" />
                    <Lieu - Ville:"Paris" - Pays:"France" />
                    <Enfants>
                    </Enfants>
            </Famille>
            <Famille>
                    <Nom - "Durant" />
                    <Lieu - Ville:"Marseille" - Pays:"France" />
                    <Enfants>
                    </Enfants>
            </Famille>
            <Famille>
                    <Nom - "Martin" />
                    <Lieu - Ville:"Lyon" - Pays:"France" />
                    <Enfants>
                    </Enfants>
            </Famille>
    </Rapport>
    Merci de votre aide

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par sandrine06801 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk -F, (...)
       split($0,array,";");
       (...)
       for (i = 4; i <= NF; i+=2) {
    soit tu utilises les champs positionnels ($1, $2, ..., $NF) et c'est awk -F; qu'il faut mettre comme séparateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/usr/bin/awk -f
     
    BEGIN {
       FS=";"
       print "<Rapport>"
    }
     
    {
       printf("\t<Famille>\n\t\t<Nom - \"%s\" />\n\t\t<Lieu - Ville:\"%s\" - Pays:\"%s\" />\n\t\t<Enfants>\n", $1, $2, $3)
       for (i = 4; i < NF; i+=2) {
          printf("\t\t\t<Enfant - Prenom:\"%s\" - Age:%d />\n", $i, $(i+1))
       }
       printf("\t\t</Enfants>\n\t</Famille>\n")
    }
     
    END {
       print "</Rapport>"
    }
    soit tu split() et auquel cas dans la boucle ce n'est pas NF qu'il faut tester mais length(array)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/usr/bin/awk -f
     
    BEGIN {
       print "<Rapport>"
    }
     
    {
       split($0, array, ";")
       printf("\t<Famille>\n\t\t<Nom - \"%s\" />\n\t\t<Lieu - Ville:\"%s\" - Pays:\"%s\" />\n\t\t<Enfants>\n", array[1], array[2], array[3])
       for (i = 4; i < length(array); i+=2) {
          printf("\t\t\t<Enfant - Prenom:\"%s\" - Age:%d />\n", array[i], array[i+1])
       }
       printf("\t\t</Enfants>\n\t</Famille>\n")
    }
     
    END {
       print "</Rapport>"
    }
    le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $ diff -du <(./script.awk parents.csv) <(./script2.awk parents.csv)
    $ ./script.awk parents.csv
    <Rapport>
            <Famille>
                    <Nom - "Dupont" />
                    <Lieu - Ville:"Paris" - Pays:"France" />
                    <Enfants>
                            <Enfant - Prenom:"Martin" - Age:5 />
                            <Enfant - Prenom:"Axelle" - Age:12 />
                            <Enfant - Prenom:"Quentin" - Age:3 />
                    </Enfants>
            </Famille>
            <Famille>
                    <Nom - "Durant" />
                    <Lieu - Ville:"Marseille" - Pays:"France" />
                    <Enfants>
                            <Enfant - Prenom:"Theo" - Age:5 />
                    </Enfants>
            </Famille>
            <Famille>
                    <Nom - "Martin" />
                    <Lieu - Ville:"Lyon" - Pays:"France" />
                    <Enfants>
                            <Enfant - Prenom:"Leon" - Age:2 />
                            <Enfant - Prenom:"Ariane" - Age:1 />
                    </Enfants>
            </Famille>
    </Rapport>

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci beaucoup pour votre aide ultra rapide et pour les explications

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

Discussions similaires

  1. Génération fichier .csv via une requête SQL
    Par matnys dans le forum Import/Export
    Réponses: 5
    Dernier message: 12/12/2011, 22h03
  2. Génération fichier csv pb avec ";"
    Par cyberdevelopment dans le forum Débuter
    Réponses: 3
    Dernier message: 10/10/2011, 09h58
  3. Génération fichier csv problème accent
    Par marion782 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 11/08/2009, 09h16

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