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