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 :

[SHELL] Convertir un XML en CSV


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 83
    Par défaut [SHELL] Convertir un XML en CSV
    Bonjour,

    Je dispose d'un fichier XML sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xml>
          <element>
               <nom>DUPOND</nom
               <prenom>Paul</prenom>
               ....
         </element>
         <element>
               <nom>DURAND</nom
               <prenom>Pierre</prenom>
               ....
         </element>
    </xml>
    Je cherche à extraire les données de ce xml et de les mettre au format CSV dans un unique fichier de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom;prenom;....
    DUPOND;Paul;...
    DURAND;Pierre...
    La contrainte est que l'ordre ainsi que le nombre de balises XML peut varier ( on peut ajouter par exemple la balise adresse, et inverser nom / prenom), donc avoir un système souple et dynamique.

    (Le fichier XML est un fichier dépassant les 100Mo)

    Ce que j'ai commencé à faire :

    Suppression des balises xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    awk "/<xml>/,/<\/xml>/" fichier.xml | grep -v "xml>" > fichier.log
    while read line;do
           # Nouvelle ligne
           if [ "$line" == "<element>" ]
           then
                  echo -e '\n'
           else
                   echo  $line | cut -d "[" -f 3 | cut -d "]" -f 1 => Recuperation de la valeur de la balise
           fi
           done
    done < fichier.log
    Je suis pas vraiment avancé, il me manque à savoir de quelle balise il s'agit, et ordonner à la rigueur les valeurs pour créer la ligne csv.
    Mais vraiment pas terrible comme algo.

    Merci de votre aide

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    il me manque à savoir de quelle balise il s'agit, et ordonner à la rigueur les valeurs pour créer la ligne csv.
    d'autant plus qu'une balise peut être dans l'<élément>, ou ne pas y être.
    d'un côté, tu as de la souplesse, pour écrire le fichier XML,
    de l'autre, pour le lire et le convertir, c'est beaucoup de contraintes.

    à mon avis, le shell n'est pas adapté pour ce type de traitement, et ça me semble, à vue de nez, même un peu difficile pour awk (dans l'absolu, non, mais dans ce cas précis, oui)

    il y a un outil xml2, qui pourrait t'aider, mais peut-être faut-il que le fichier XML ait été écrit avec rigueur :
    --
    xml2 : Conversion entre XML, HTML, CSV et un format orienté ligne
    Les outils xml2 sont utilisés pour convertir du XML, HTML et CSV à partir
    de et vers un format orienté ligne plus facilement utilisable par des
    outils de traitement par tubes classiques d'UNIX, comme grep, sed, awk,
    cut, des scripts shell et ainsi de suite.
    --
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Pour du parsing XML (parcours d'arbres DOM, XPATH, ...), c'est faisable en bash/sed/awk & compagnie mais c'est vraiment pas la solution la plus optimale.

    Personnellement je te recommande de t'orienter vers un langage shell plus haut niveau ayant des classes et lib prévues et optimisées pour ça. Exemple : Perl ou PHP (en mode interpréteur shell pas en tant que langage web utilisable avec http/apache, tu as la possibilité d'avoir un interpréteur shell /usr/bin/php comme en Perl) ou bien d'autres.

    Exemple en PHP :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    [idriss@hp-dv6:~]$ cat entree.xml
    <xml>
          <element>
               <nom>DUPOND</nom>
               <prenom>Paul</prenom>
         </element>
         <element>
               <nom>DURAND</nom>
               <prenom>Pierre</prenom>
         </element>
    </xml>
    [idriss@hp-dv6:~]$ cat test.php
    #!/usr/bin/php
    <?php
        $xml = new SimpleXMLElement (file_get_contents("entree.xml"));
     
        $xpathElements = $xml->xpath('/xml/element');
     
        $fileContent = "";
        foreach ($xpathElements as $elem){
            if ($nom = $elem->nom){
                $fileContent .= $nom[0];
            }
     
            $fileContent .= ";";
     
            if ($prenom = $elem->prenom){
                $fileContent .= $prenom[0];
            }
     
            // ...
            $fileContent .= "\n";
        }
     
        file_put_contents("sortie.csv", $fileContent);
    ?>
    [idriss@hp-dv6:~]$ chmod +x test.php
    [idriss@hp-dv6:~]$ ./test.php
    [idriss@hp-dv6:~]$ cat sortie.csv
    DUPOND;Paul
    DURAND;Pierre
    [idriss@hp-dv6:~]$
    EDIT : je viens de lire que ton fichier dépasse les 100MO, si je ne m'abuse je crois que Perl est quand même plus rapide en mode shell que PHP. Donc je te conseil d'aller voir aussi du côté de Perl qui t'offre des choses assez équivalentes à ce que je viens d'écrire en PHP (après perso je ne connaît pas la syntaxe Perl de tête n'étant pas très habitué à ce langage mais je n'hésiterait pas à sauter le pas si j'étais confronté à une contrainte de perf). Bon même PHP sur 100MO ça devrait le faire.

    Cordialement,
    Idriss

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 83
    Par défaut
    Hello,

    Merci pour vos retours rapides

    Je m'étais orienté sur PERL avec le super tuto du Parser XML : http://djibril.developpez.com/tutoriels/perl/perl-xml/

    Au final, en essayant ta solution Idriss, je parse en moins de 3 secondes avec le php en mode shell mon XML.
    Perl est plus rapide, mais plus strict, et comme je suis aussi confronté à des caractères emmerdants, PHP Shell reste un bon compromis.

    Merci pour votre aide

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

Discussions similaires

  1. Convertir : fichier XML irregulier To Csv
    Par BertrandB dans le forum C#
    Réponses: 1
    Dernier message: 27/02/2015, 17h31
  2. Convertir un fichier xml en csv
    Par tegleyt dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 21/04/2011, 17h01
  3. Convertir xml en csv
    Par antitrust56 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 12/11/2008, 09h43
  4. Convertir fichier XML -> CSV
    Par devdev2003 dans le forum Modules
    Réponses: 4
    Dernier message: 13/03/2008, 23h43
  5. [String]Convertir pour xml
    Par Pill_S dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 05/11/2004, 19h41

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