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

Python Discussion :

parser fichier xml vers fichier csv


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Février 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2011
    Messages : 7
    Points : 83
    Points
    83
    Par défaut parser fichier xml vers fichier csv
    bonjour à tous,
    dans le cadre d'une migration de base de données de winisis(base de données documentaire de l'omvs) vers mysql,j'ai adopté la procédure suivante:

    -récupération des bases de données au format xml avec isis2xml
    -à partir du format xml générer un csv
    -et enfin du fichier csv généré migrer tout le contenu dans la base de données mysql

    les contraintes:

    -pour la base de données j'ai un certain nombre de champs dont les noms vont devenir les balises xml(par exemple j'ai 6 champs qui vont donner 6 Tags nommés de Tag_1 à Tag_6(ou les noms des champs dans la base peu importe)
    -chaque bloc <RECORD> de mon fichier xml(voir fichier joint test.xml) correspond à une ligne avec les différents Tag_x correspondants au champs
    *MAIS chaque bloc <RECORD> N'EST PAS OBLIGER D'AVOIR LES 6 champs,il peut avoir Tag_1,Tag_2...pas de Tag_4...Tag_6..ect
    *De même un Tag_x peut être répété plusieurs fois dans un bloc <RECORD>

    Résultat attendu lors de la création du fichier csv:
    -chaque bloc <RECORD> correspond à une ligne et chaque Tag dans une cellule
    -si une balise Tag_x n'est pas dans un bloc <RECORD> laisser la cellule dans le fichier csv vide ou mettre valeur null
    - si un Tag est répété plusieurs fois dans un bloc <RECORD> exemple:
    <RECORD>
    ....
    ...
    <Tag_5>x</Tag_5>
    <Tag_5>y</Tag_5>
    <Tag_5>z</Tag_5>
    </RECORD>
    il faut les concater en les séparant par le symbole '||' ce qui doit donner x||y||z

    exemple de sortie csv: test.xml=>test.csv
    -Les entêtes du fichier csv:
    Tag_1 =Auteur
    Tag_2 = Titre
    Tag_3 = Lieu
    Tag_4 = Date
    Tag_5 = Editeur(s)
    Tag_6 = Mots clés
    -séparateur: $
    -ouverture du fichier dans un éditeur de texte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Auteur$Titre$Lieu$Date$Editeur(s)$Mots clés"
    "zzeze$grthhh$fdzee$efrerg$phhh$perezf||ergrg||efgrgg"
    "pzderrt$fjpoerer$null$ggghghghg$fhgf||fhfuhrr$fhhejr"
    "zeaeeyr$pprirtu$fgjjrt$null$dhjehe||fdggg||fdzf||fffrf$null"
    "dfffggg$fghthyj$fggtrhhy$ffrregggg$null$dhhfjgj||dffff||ffffgfg"
    -Aprés ouverture du fichiercsv dans un tableur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Auteur          Titre          Lieu              Date                      Editeur(s)                                                 Mots clés
    zzeze            grthhh        fdzee           efrerg                     phhh                                                         perezf||ergrg||efgrgg
    pzderrt          fjpoerer      null             ggghghghg               fhgf||fhfuhrr                                              fhhejr
    zeaeeyr         pprirtu        fgjjrt           null                        dhjehe||fdggg||fdzf||fffrf                              null
    dfffggg          fghthyj        fggtrhhy       ffrregggg                null                                                           dhhfjgj||dffff||ffffgfg
    Aide demandée:
    je n'ai pas de souci pour générer le fichier xml,de même que le fichier csv avec un petit programme python,Mais mon souci principal est le fait que comme on a pas tout le temps le même nombre de balise Tag_x dans chaque bloc <RECORD> du fichier xml le programme au lieu de laisser les champs dont les Tag n'ont pas étaient trouvés vide ou mettre null,il les remplit avec le contenu de la valeur du premier Tag_x trouvé:exemple si on est dans la ligne 2 si le Tag_4 n'existe pas alors il prend la valeur du Tag_4 de la ligne 1...etc ce qui n'est pas correcte.
    De même si le même Tag est rencontré plusieur fois dans un bloc <RECORD> j'arrive à concaténer toutes les valeurs en les séparant par || mais le souci est que pour le dernier de la liste il rajoute également || exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <RECORD>
    ....
    ...
    <Tag_5>x</Tag_5>
    <Tag_5>y</Tag_5>
    <Tag_5>z</Tag_5>
    </RECORD>
    une fois la concaténation effectuée j'ai x||y||z|| donc il faut arriver à détecter le nombre de fois que le Tag_5 a été trouvé ,de rajouter à chaque fois '||' lors de la concaténation SAUF aprés le dernier ===> x||y||z
    contenu fichier test.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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <DATABASE>
    	<RECORD>
    		<Tag_1>G Bush</Tag_1>
    		<Tag_2>good moning vietnam</Tag_2>
    		<Tag_3>Vietnam</Tag_3>
    		<Tag_4>20/12/2011</Tag_4>
    		<Tag_5>eyrolles</Tag_5>
    		<Tag_5>la redoute</Tag_5>
    		<Tag_5>ENI</Tag_5>
    		<Tag_6>vietnam</Tag_6>
    		<Tag_6>guerre</Tag_6>
    		<Tag_6>amérique</Tag_6>
    	</RECORD>
    	<RECORD>
    		<Tag_1>Aime cesaire</Tag_1>
    		<Tag_2>Et les chiens se taisaient</Tag_2>
    		<Tag_3>Martinique</Tag_3>
    		<Tag_6>Martinique</Tag_6>
    		<Tag_6>colonisation</Tag_6>
    		<Tag_6>afrique</Tag_6>
    		<Tag_6>négre</Tag_6>
    		<Tag_6>négritude</Tag_6>
    	</RECORD>
    	<RECORD>
    		<Tag_1>Cheikh Anta diop</Tag_1>
    		<Tag_2>nations négres et cultures</Tag_2>
    		<Tag_3>paris</Tag_3>
    		<Tag_3>Sénégal</Tag_3>
    		<Tag_3>Mali</Tag_3>
    		<Tag_4>20/01/1963</Tag_4>
    		<Tag_5>Presence africaines</Tag_5>
    		<Tag_5>la redoute</Tag_5>
    		<Tag_5>ENI</Tag_5>
    		<Tag_5>Mollat</Tag_5>
    		<Tag_5>Green library</Tag_5>
    		<Tag_6>negritude</Tag_6>
    		<Tag_6>Egypte</Tag_6>
    		<Tag_6>champollion</Tag_6>
    		<Tag_6>carbone14</Tag_6>
    	</RECORD>
    	<RECORD>
    		<Tag_1>Albert camus</Tag_1>
    		<Tag_2>L'étranger</Tag_2>
    		<Tag_3>alger / algerie</Tag_3>
    		<Tag_5>eyrolles</Tag_5>
    		<Tag_6>algérie</Tag_6>
    		<Tag_6>france</Tag_6>
    		<Tag_6>colonialisme</Tag_6>
    		<Tag_6>musulman</Tag_6>
    	</RECORD>
    	<RECORD>
    		<Tag_1>Aime cesaire</Tag_1>
    		<Tag_2>La tragédie du roi christophe</Tag_2>
    		<Tag_3>Paris</Tag_3>
    		<Tag_4>14/12/1969</Tag_4>
    		<Tag_5>Présences africaines</Tag_5>
    		<Tag_5>Mollat</Tag_5>
    		<Tag_6>haitie</Tag_6>
    		<Tag_6>france</Tag_6>
    		<Tag_6>décolonisation</Tag_6>
    		<Tag_6>noir</Tag_6>
    		<Tag_6>guerre</Tag_6>
    		<Tag_6>liberation</Tag_6>
    	</RECORD>
    	<RECORD>
    		<Tag_1>Aime cesaire</Tag_1>
    		<Tag_2>Cahier d'un retour au pays natal</Tag_2>
    		<Tag_3>russie</Tag_3>
    		<Tag_4>03/11/1957</Tag_4>
    		<Tag_5>Eyrolles</Tag_5>
    		<Tag_6>nostalgie</Tag_6>
    		<Tag_6>négritude</Tag_6>
    		<Tag_6>immigration</Tag_6>
    		<Tag_6>distance</Tag_6>
    	</RECORD>
    </DATABASE>
    exemple de programme python(ceci était la première version du programme sans le code qui permet de concaténer les contenus des mêmes Tag_x trouvés dans un bloc <RECORD>):
    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
     
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import xml.etree.cElementTree as xmlTree
    import sys
    import csv
     
    if len(sys.argv) <= 1:
        raise Exception("Usage: %s xml-file" % sys.argv[0])
     
    filename = sys.argv[1]
    fichier = open(filename, 'r')
    tree = xmlTree.fromstring(fichier.read())
    lang_elements = tree.getiterator("RECORD")
    out = csv.writer(open('test.csv','wb'), delimiter='$',quoting=csv.QUOTE_ALL)
    out.writerow(['Auteur', 'Titre' , 'Lieu de Publication', 'Date de Publication', 'Editeur', 'mots Clés'])
    for lang in lang_elements:
        for characteristic in lang:
            if characteristic.tag == "Tag_1":
                auteur = characteristic.text
            elif characteristic.tag == "Tag_2":
                titre = characteristic.text
            elif characteristic.tag == "Tag_3":
                LieuPublication = characteristic.text
            elif characteristic.tag == "Tag_4":
                DatePublication = characteristic.text
            elif characteristic.tag == "Tag_5":
                Editeur = characteristic.text
            elif characteristic.tag == "Tag_6":
                motsCles = characteristic.text
        #print "%s$%s$%s$%s$%s$%s" % (auteur, titre , LieuPublication, DatePublication, Editeur, motsCles)
        ligne = u"%s$%s$%s$%s$%s$%s" % (auteur, titre , LieuPublication, DatePublication, Editeur, motsCles)
        data = [(ligne.encode('UTF-8'))]    
        out.writerow(data)
    Merci de votre aide ou de vos suggestions

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 449
    Points : 37 044
    Points
    37 044
    Par défaut
    Salut,
    Ce que j'ai retenu (mais j'ai lu vite) est que les différents champs n'étaient pas initialisés à leurs valeurs par défaut avant la lecture du RECORD suivant. Dans le cas ou ce dernier n'avait pas de valeur définie, en sortie,on récupérait l'ancienne valeur - characteristic.tag ne prenant que les valeurs définies...

    Therefore quick and dirty:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #... cut du code exitant
    for lang in lang_elements:
        #+ reset des champs à la valeur par defaut
        auteur, titre , LieuPublication, DatePublication, Editeur, motsCles = None
        #-
        for characteristic in lang:
        #... as before
        ligne = u"%s$%s$%s$%s$%s$%s" % (auteur, titre , LieuPublication, DatePublication, Editeur, motsCles)
        data = [(ligne.encode('UTF-8'))]    
        out.writerow(data)
    Bon courage,
    - W

Discussions similaires

  1. [XSLT] transformation xml vers fichier .text !
    Par kader78190 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/11/2006, 13h45
  2. [JDOM] Déplacer un sous arbre d'un fichier xml vers un autre
    Par LannionJava dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 21/07/2006, 16h51
  3. Réponses: 1
    Dernier message: 28/04/2006, 17h17
  4. Importation d'un fichier xml vers une BD mysql avec php
    Par naima2005 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 28/04/2006, 16h23
  5. newbie : fichier xml vers html via command-line
    Par morti dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 08/11/2005, 08h34

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