Bonjour
je voudrais savoir ce que je peut utiliser pour parser un fichier plat en fichier xml
pour tout vous dire je débute avec le xml et je ne sais trops vers ou me diréger.
merci d'avence pour votre aide
Bonjour
je voudrais savoir ce que je peut utiliser pour parser un fichier plat en fichier xml
pour tout vous dire je débute avec le xml et je ne sais trops vers ou me diréger.
merci d'avence pour votre aide
tout ce qui est transformation cvs, txt, ... vers xml j'utilise des programmes maison écrit en python.
Donc si tu explicites ton problème: comment en construit ton txt , ... je peux te donner un coup de main pour écrire le programme qui va bien![]()
Bonjour
je serai trés heureuse de bénificier de votre aide .
pour le détail que vous demander je ne comprend pas ce que vous voulait savoir*
les fichiers plats sont des fichier de données organisé en réalité je peut avoir n'importe qu'el type de données l'essenciel et que je peux les transformer en un fichier xml
pour pyton je ne sais pas programmer en ce language; mais moi je penssait que je pourrait utilisé java
En faite vous me donner déjà beaucoup de réponse:
votre fichier plat est organisé cela veux dire que entre le caractère 1 et 10 j'ai le code client, entre 10 et 20 j'ai l'article ,... (ceci n'est qu'un exemple).
je ne me déclare pas programmeur en java mais le code python est assez facile à lire pour pouvoir trouver l'algo.
je vous propose un programme python qui prend en entrée votre fichier plat et un fichier xml qui décrit la structure de votre fichier plat
flat2xml.py
un fichier plat d'exemple
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 #!/usr/bin/python import os.path, os, shutil, time, string import sys, getopt from xml.dom.minidom import * from xml import xpath pg_version="1.9" pg_author="Frederic Aoustin" pg_contact="fraoustin@yahoo.fr" pg_name="flat2xml" # todo # not fix # gerer log et trace def usage(): print """Usage: %s %s -h --help : help %s -v : version %s -i FlatFile -d XmlDescriptor [-o XmlOut] : convert file in xml """ % (pg_name, pg_name, pg_name, pg_name) version() def version(): print "Version:\n%s version %s by %s(%s)" % (pg_name, pg_version, pg_author, pg_contact) def saveFile(path, content): endfile = open(path,'w') endfile.write(content) endfile.close() def readFile(inFile): f=open(inFile,'r') contents=f.readlines() f.close() return contents def init(xmldoc): if "num" in xmldoc.documentElement.attributes.keys(): fix = True num = xmldoc.documentElement.attributes["num"].value else: fix = False num="-1" if "name" in xmldoc.documentElement.attributes.keys(): name = xmldoc.documentElement.attributes["name"].value else: name="root" return fix, num, name def getAttr(node, attr, default="unknown"): if attr in node.attributes.keys(): return node.attributes[attr].value return default def createElt(xmldoc, node, desc, data, ids): for n in desc.childNodes: if n.nodeType == Node.ELEMENT_NODE and n.nodeName == "element": xmlelt = xmldoc.createElement(n.lastChild.data) mi=getAttr(n,"min","0") mx=getAttr(n,"max","") if mi != "" and mx != "": xmlelt.appendChild(xmldoc.createTextNode(data[int(mi):int(mx)])) if mi != "" and mx == "": xmlelt.appendChild(xmldoc.createTextNode(data[int(mi):])) if mi == "" and mx != "": xmlelt.appendChild(xmldoc.createTextNode(data[:int(mx)])) if mi == "" and mx == "": xmlelt.appendChild(xmldoc.createTextNode(data)) node.appendChild(xmlelt) createElt(xmldoc, xmlelt, n , data, ids) if n.nodeType == Node.ELEMENT_NODE and n.nodeName == "row": xmlelt = xmldoc.createElement(getAttr(n,"name","row")) node.appendChild(xmlelt) createElt(xmldoc, xmlelt, n , data, ids) if n.nodeType == Node.ELEMENT_NODE and n.nodeName == "attr": if "min" in n.attributes.keys(): mi=getAttr(n,"min","0") mx=getAttr(n,"max","") if mi != "" and mx != "": d=data[int(mi):int(mx)] if mi != "" and mx == "": d=data[int(mi):] if mi == "" and mx != "": d = data[:int(mx)] if mi == "" and mx == "": d = data node.setAttribute(n.lastChild.data,d) if "fix" in n.attributes.keys(): node.setAttribute(n.lastChild.data,getAttr(n,"fix","0")) if "param" in n.attributes.keys(): if getAttr(n,"param","0") == "id": node.setAttribute(n.lastChild.data,ids) def convert(flat, xml, out=None): try: data = readFile(flat) xmldoc = parse(xml) root=xmldoc.documentElement fix, num, name = init(xmldoc) xmlout = Document() xmltag = xmlout.createElement(name) xmlout.appendChild(xmltag) for i in data: i =i[:-1] if fix: row = xpath.Evaluate("/root/row[@id='%s']" % i[0:int(num)] , root) else: rows = xpath.Evaluate("/root/row" , root) row=[] for k in rows: if getAttr(k,"id","") == i[0:len(getAttr(k,"id",""))]: row.append(k) for j in row: xmlrow = xmlout.createElement(getAttr(j, "name", "row")) xmltag.appendChild(xmlrow) if fix: l = int(num) else: l = len(getAttr(j,"id","")) createElt(xmlout, xmlrow, j , i[l:], i[0:l]) if out == None: print xmlout.toxml() else: saveFile(out, xmlout.toxml()) except Exception, e: print "Error ", e if __name__ == "__main__": #convert(flat = "/home/fraoustin/MyProject/XML/flat_to_xml/flat_to_xml_fix.txt",xml = "/home/fraoustin/MyProject/XML/flat_to_xml/flat_to_xml_fix.xml",out = "/home/fraoustin/MyProject/XML/flat_to_xml/out.xml") try: i, d, o = None, None, None opts, args = getopt.getopt(sys.argv[1:], "hvi:d:o:", ["help"]) if len(opts) == 0: usage() sys.exit() for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() if opt in ("-v"): version() sys.exit() if opt in ("-i"): i = arg if opt in ("-o"): o = arg if opt in ("-d"): d = arg if i != None and d != None: convert(flat=i, xml=d, out=o) else: print "Error in parameters" usage() except getopt.GetoptError, r: print "Error", r usage() except Exception,e: print e
un fichier xml qui décrit la structure
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 id111222333344444 id2aabbbddddeeeff id3aaaaaaaaabbbbb id3aaaaaaaaaddddd id3aaaaaaaaaeeeee id3fffffffffbbbbb id2aabbbccddeeeff
et 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
29
30 <?xml version="1.0" ?> <root num="3" name="racine"> <row id="id1" name="fred"> <attr min="0" max="2">id</attr> <element min="0" max="2"><attr min="0" max="2">elt1</attr>elt1</element> <element min="2" max="5">elt2</element> <element min="5" max="9">elt3</element> <element min="9" max="">elt4</element> <row name="essai"> <element min="0" max="2">elt1</element> <element min="2" max="5">elt2</element> <element min="5" max="9">elt3</element> <element min="9" max="">elt4</element> </row> </row> <row id="id2" name="rows"> <attr fix="tutu">id</attr> <element min="0" max="2">elt1</element> <element min="2" max="5">elt2</element> <element min="5" max="9">elt3</element> <element min="9" max="12">elt4</element> <element min="12" max="">elt5</element> </row> <row id="id3"> <attr param="id">id</attr> <element min="0" max="9">elt11</element> <element min="9" max="">elt2</element> <element min="" max="">all</element> </row> </root>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <?xml version="1.0" ?> <racine><row><elt1>11</elt1><elt2>222</elt2><elt3>3333</elt3><elt4>44444</elt4></row><row><all>111222333344444</all></row><row><elt1>aa</elt1><elt2>bbb</elt2><elt3>dddd</elt3><elt4>eee</elt4><elt5>ff</elt5></row><row><all>2aabbbddddeeeff</all></row><row><elt11>aaaaaaaaa</elt11><elt2>bbbbb</elt2><all>aaaaaaaaabbbbb</all></row><row><all>3aaaaaaaaabbbbb</all></row><row><elt11>aaaaaaaaa</elt11><elt2>ddddd</elt2><all>aaaaaaaaaddddd</all></row><row><all>3aaaaaaaaaddddd</all></row><row><elt11>aaaaaaaaa</elt11><elt2>eeeee</elt2><all>aaaaaaaaaeeeee</all></row><row><all>3aaaaaaaaaeeeee</all></row><row><elt11>fffffffff</elt11><elt2>bbbbb</elt2><all>fffffffffbbbbb</all></row><row><all>3fffffffffbbbbb</all></row><row><elt1>aa</elt1><elt2>bbb</elt2><elt3>ccdd</elt3><elt4>eee</elt4><elt5>ff</elt5></row><row><all>2aabbbccddeeeff</all></row></racine>
merci
je vais étudier le code et je vous tiendrais au courent de l'évolution de mon travail.
Bonjour
Je vous serai très reconnaissante si vous pouviez m'indiquer une documentation appropriée pour pouvoir déchiffrer le code en python que vous m'avez envoyé.
Merci
Comment se présente vos fichier texte ?
Pouvons nous avoir un exemple ?
En quel langage voulez vous coder ?
Bonjour
L’exemple que vous me demandez est le suivant:
fr 001 duboss marine 18 f
an 002 tato fred 20 h
sp 003 faro kholio 21 h
Je veux programmer en java.
Le programme proposé en python est intéressant mais je trouve des difficultés pour le comprendre et la doc dont j'ai besoin semble introuvable.
J’ai juste envi de comprendre quelques instructions.
J’en profit aussi pour vous demander vers de m’orienter vers les apis dont j’ai besoin.
Merci de votre intérêt pour ma question
Salut !
Si j'ai bien compris, t'aimerai utilisé le XML pour présenter les informations de ton fichier donné en exmple ... !
Passé de ça :
à ça :Envoyé par jasminrose
Ceci n'étant qu''un exemple !
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 <fichier> <nouvelle_entree id="001"> <langue>fr</langue> <nom>duboss</nom> <prenom>marine</prenom> <age>18</age> <sexe>f</sexe> </nouvelle_entree> <nouvelle_entree id="002"> <langue>en</langue> <nom>tato</nom> <prenom>fred</prenom> <age>20</age> <sexe>h</sexe> ... </nouvelle_entree> </fichier>
Pour ce faire, il suffit de lire ligne par ligne ton fichier plat, d'en extraire les informations (apparemment toutes séparées par un espace) et de les réecrire dans un nouveau fichier selon la nouvelle "mise en page" XML ...
Pour ce qui est des parsers (pour la relecture, car l'écriture je le ferai simplement moi-même ...), je n'en connais aucun en Java, mais tu devrais trouver ton bonheur ici !![]()
Bonjour
Merci pour votre aide.
Voila j'ai résolu mon problème entre temps en suivent la méthode que vous venez d'expliquer.
Mais bien sur j'ai rencontré un autre problème.
je n'arrive qu'a lire une seul ligne de mon fichier txt .
donc je ne reussi qu'a creer un seul fils du noeud reacine.![]()
j'ai utilisé les "subString "pour récuperer mes informations
Un ptit bout de ton code aiderai quelque peu ...
Tu utilises quoi pour lire ton fichier, une boucle ... ? Tu ne fais qu'une seule fois la lecture de ta ligne ... ?
Désoler de vous l'envoyer comme ça mais je ne sais pas comment vous l'écrire dans un cadre
Code java : 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import java.io.*; public class CreationDOM{ public static void transformerXml(Document document, String fichier) { try { // Création de la source DOM Source source = new DOMSource(document); // Création du fichier de sortie File file = new File(fichier); Result resultat = new StreamResult(fichier); // Configuration du transformer TransformerFactory fabrique = TransformerFactory.newInstance(); Transformer transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformation transformer.transform(source, resultat); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args){ String ligne,chaine,f; try { BufferedReader in = new BufferedReader(new FileReader("Fichier.txt")); while ( (f = in.readLine()) != null) { try{ // Création d'un nouveau DOM DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); DocumentBuilder constructeur = fabrique.newDocumentBuilder(); Document document = constructeur.newDocument(); // Propriétés du DOM document.setXmlVersion("1.0"); document.setXmlStandalone(true); // Création de l'arborescence du DOM Element personne = document.createElement("personne"); Element nom = document.createElement("nom"); nom.setAttribute("nom",f.substring(0,19)); personne.appendChild(nom); Element prenom = document.createElement("prenom"); prenom.setAttribute("nom",f.substring(19,39)); personne.appendChild(prenom); Element adresse = document.createElement("adresse"); adresse.setAttribute("nom",f.substring(39,69)); personne.appendChild(adresse); Element sex = document.createElement("sex"); sex.setAttribute("nom",f.substring(69,70)); personne.appendChild(sex); document.appendChild(personne); //Sauvegarde du DOM dans un fichier XML transformerXml(document, "./exemple.xml"); } catch(Exception e){ e.printStackTrace(); } } in.close(); } catch (Exception e) { System.out.println(e.toString()); } } }
je n'arrive pas a ecrir les trois lignes de mon fichier txt que je vous donne
les champs ont la longueur suivente: 20;20;40;1jasmin rose france c
madline toto almagne m
papa mama algerie c
Bonjour
Alors les amis developpeurs y a personne pour m'aider![]()
Salut,
Je proposer une autre approche à laquelle je pense car je travaille bcp avec le framework Cocoon en ce moment.
Je traiterais le pb en 2 temps:
- transformer le fichier plat en xml simpliste avec un noeud par ligne.
- utiliser le xslt pour extraire les données.
Ca aurait l'avantage de découpler l'extraction (et donc implicitement la déclaration de la structure du fichier que tu traites) du programme java.
Ca rend le programme java générique et permet d'adapter le traitement à de futurs formats de ficher plat en entrée en créant simplement de multiple fichiers xslt.
Tu peux regarder l'example de l'email dans http://jsn-server5.com/cocoon/sample...s/slop/welcome qui correspond à ce que la premiere passe devrait faire.
--------------------------------
Sinon, en regardant ton programme, je vois que tu fais le:
//Sauvegarde du DOM dans un fichier XML
transformerXml(document, "./exemple.xml");
Dans la boucle while qui lis les ligne, donc à chaque ligne le fichier xml est écrasé.
ça aurait l'avantage de découpler l'extraction (et donc implicitement la déclaration de la structure du fichier que tu traites) du programme java.
Pardon je n'ai pas bien compris cette phrase
Et puis est ce qu'il me serait plus simple de transformer mes fichiers plats en fichiers xml ensuite extraire les données pour construire mon fichier xml dont j'ai besoin
Ou plutot extraire les données de mes fichier plats, les stocker dans un fichier temporaire ensuite construire mon fichier xml
La seconde solutions me pose des problèmes par contre la première proposée je ne l'ai pas utilisé.
Puis je avoir votre avis
et puis a quel niveau intervient le xslt et comment puis je en profiter
Brièvement le xslt est la norme de transformation de fichier xml définie par le w3c. Le xslt utilise un fichier xml (.xsl le plus souvent) qui définit la transformation qu'on souhaite appliquer à un fichier xml et un moteur XSLT (programme qui va utiliser le fichier .xml source et le .xsl pour produire une sortie en xml le plus souvent).
La plupart des navigateur intègrent un moteur xslt ce qui leur permet d'afficher une page html a partir d'un fichier xml et xsl.
En java le moteur xalan est très répandu.
Une intro au xslt: http://haypo.developpez.com/tutoriel/xml/xslt/
Si tu es néophyte en xslt et que tu es pressé d'avoir un résultat, peut être restes en au programme java.
Je vais poser alors une autre question
comment utiliser xslt pour transformer un fichier plat en fichier xml.
moi j'ai utilise dom pour effectuer cette ransformation
et puis j'ai meme une autre question qui me traverse l'esprit
est ce que si je transforme mes fichiers plat en fichier xml
ensuite j'utilise un xslt pour formater le document xml dont j'ai besoin
Le xlst ne manipule que du xml en entrée.
Tu peux garder ton programme java pour créer un fichier xml générique du style:
Et apres laisser un ficher xsl définir les portions à extraire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?xml version="1.0"?> <fichier> <ligne id="1">fr 001 duboss marine 18 f</ligne> <ligne id="2">an 002 tato fred 20 h</ligne> <ligne id="3">sp 003 faro kholio 21 h</ligne> ... </fichier>
Ce qui donnera:
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 <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:output method = "xml" version="1.0" encoding="UTF-8" omit-xml-declaration="no" standalone="no" indent="yes" /> <xsl:template match="/"> <peoples> <xsl:apply-templates select = "//ligne" /> </peoples> </xsl:template> <xsl:template match="ligne"> <people> <xsl:variable name="param1" select="substring-before(.,' ')"/> <xsl:variable name="param2" select="substring-before(substring-after(.,concat($param1,' ')),' ')"/> <xsl:variable name="nom" select="substring-before(substring-after(.,concat($param2,' ')),' ')"/> <xsl:variable name="prenom" select="substring-before(substring-after(.,concat($nom,' ')),' ')"/> <xsl:variable name="age" select="substring-before(substring-after(.,concat($prenom,' ')),' ')"/> <xsl:variable name="sexe" select="substring-after(.,concat($age,' '))"/> <xsl:attribute name="param1" ><xsl:value-of select="$param1"/></xsl:attribute> <xsl:attribute name="param2" ><xsl:value-of select="$param2"/></xsl:attribute> <xsl:attribute name="nom" ><xsl:value-of select="$nom"/></xsl:attribute> <xsl:attribute name="prenom" ><xsl:value-of select="$prenom"/></xsl:attribute> <xsl:attribute name="age" ><xsl:value-of select="$age"/></xsl:attribute> <xsl:attribute name="sexe" ><xsl:value-of select="$sexe"/></xsl:attribute> </people> </xsl:template> </xsl:stylesheet>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <peoples> <people param1="fr" param2="001" nom="duboss" prenom="marine" age="18" sexe="f" /> <people param1="an" param2="002" nom="tato" prenom="fred" age="20" sexe="h" /> <people param1="sp" param2="003" nom="faro" prenom="kholio" age="21" sexe="h" /> </peoples>
Partager