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:
-Aprés ouverture du fichiercsv dans un tableur:
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"
Aide demandée:
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
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:
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
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>
contenu fichier test.xml:
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
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>
Merci de votre aide ou de vos suggestions
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)
Partager