Je veux convertir un fichier csv en fichier xml avec python. Je veux regrouper les mêmes identifiants dans le fichier csv et convertir le csv pour convertir xml (voir sortie souhaitée). C'est un peu complexe qu'il n'y paraît avec l'indentation, la mise en boucle et le regroupement du csv en xml. Toute aide est appréciée.
<?xml version="1.0" encoding="UTF-8"?>
<R-Profiles xmlns="http://WKI/R-Profiles/1">
<R-Profile>
<id>a1</id>
<surfaces>
<surface>
<x1>1.3</x1>
<y1>2.1</y1>
<z1>3.6</z1>
<x2>4.5</x2>
<y2>5.1</y2>
<z2>6.8</z2>
<c1>B</c1>
<R>7.3</R>
</surface>
<surface>
<x1>2.2</x1>
<y1>3.2</y1>
<z1>4.2</z1>
<x2>5.2</x2>
<y2>6.2</y2>
<z2>7.2</z2>
<c1>S</c1>
<R>8.2</R>
</surface>
</surfaces>
</R-Profile>
<R-Profile>
<id>b2</id>
<surfaces>
<surface>
<x1>1.1</x1>
<y1>2.1</y1>
<z1>3.1</z1>
<x2>4.1</x2>
<y2>5.1</y2>
<z2>6.1</z2>
<c1>G</c1>
<R>7.1</R>
</surface>
<surface>
<x1>4.1</x1>
<y1>5.1</y1>
<z1>2.1</z1>
<x2>7.1</x2>
<y2>8.1</y2>
<z2>9.1</z2>
<c1>S</c1>
<R>2.5</R>
</surface>
<surface>
<x1>3.6</x1>
<y1>4.5</y1>
<z1>5.1</z1>
<x2>6.3</x2>
<y2>7.4</y2>
<z2>8.2</z2>
<c1>G</c1>
<R>3.1</R>
</surface>
</surfaces>
</R-Profile>
<R-Profile>
<id>c1</id>
<surfaces>
<surface>
<x1>2.1</x1>
<y1>3.1</y1>
<z1>4.1</z1>
<x2>5.1</x2>
<y2>2.1</y2>
<z2>7.1</z2>
<c1>G</c1>
<R>8.1</R>
</surface>
<surface>
<x1>1.5</x1>
<y1>1.5</y1>
<z1>1.5</z1>
<x2>1.5</x2>
<y2>1.5</y2>
<z2>1.5</z2>
<c1>A</c1>
<R>1.5</R>
</surface>
</surfaces>
</R-Profile>
<R-Profile>
<id>c2</id>
<surfaces>
<surface>
<x1>6.1</x1>
<y1>7.1</y1>
<z1>8.1</z1>
<x2>9.1</x2>
<y2>2.1</y2>
<z2>11.1</z2>
<c1>S</c1>
<R>3.2</R>
</surface>
</surfaces>
</R-Profile>
</R-Profiles>
ma sortie xml:
<?xml version="1.0" encoding="UTF-8"?>
<Roughness-Profiles xmlns="http://WKI/Roughness-Profiles/1">
<Roughness-Profile>
<surfaces>
<surface>
<id>a1</id>
<x1>1.3</x1>
<y1>2.1</y1>
<z1>3.6</z1>
<x2>4.5</x2>
<y2>5.1</y2>
<z2>6.8</z2>
<c1>B</c1>
<R>7.3</R>
</surface>
</surfaces>
</Roughness-Profile>
<surfaces>
<surface>
<id>b2</id>
<x1>1.1</x1>
<y1>2.1</y1>
<z1>3.1</z1>
<x2>4.1</x2>
<y2>5.1</y2>
<z2>6.1</z2>
<c1>G</c1>
<R>7.1</R>
</surface>
</surfaces>
</Roughness-Profile>
<surfaces>
<surface>
<id>c1</id>
<x1>2.1</x1>
<y1>3.1</y1>
<z1>4.1</z1>
<x2>5.1</x2>
<y2>2.1</y2>
<z2>7.1</z2>
<c1>G</c1>
<R>8.1</R>
</surface>
</surfaces>
</Roughness-Profile>
<surfaces>
<surface>
<id>a1</id>
<x1>2.2</x1>
<y1>3.2</y1>
<z1>4.2</z1>
<x2>5.2</x2>
<y2>6.2</y2>
<z2>7.2</z2>
<c1>S</c1>
<R>8.2</R>
</surface>
</surfaces>
</Roughness-Profile>
<surfaces>
<surface>
<id>b2</id>
<x1>4.1</x1>
<y1>5.1</y1>
<z1>2.1</z1>
<x2>7.1</x2>
<y2>8.1</y2>
<z2>9.1</z2>
<c1>S</c1>
<R>2.5</R>
</surface>
</surfaces>
</Roughness-Profile>
<surfaces>
<surface>
<id>b2</id>
<x1>3.6</x1>
<y1>4.5</y1>
<z1>5.1</z1>
<x2>6.3</x2>
<y2>7.4</y2>
<z2>8.2</z2>
<c1>G</c1>
<R>3.1</R>
</surface>
</surfaces>
</Roughness-Profile>
<surfaces>
<surface>
<id>c2</id>
<x1>6.1</x1>
<y1>7.1</y1>
<z1>8.1</z1>
<x2>9.1</x2>
<y2>2.1</y2>
<z2>11.1</z2>
<c1>S</c1>
<R>3.2</R>
</surface>
</surfaces>
</Roughness-Profile>
<surfaces>
<surface>
<id>c1</id>
<x1>1.5</x1>
<y1>1.5</y1>
<z1>1.5</z1>
<x2>1.5</x2>
<y2>1.5</y2>
<z2>1.5</z2>
<c1>A</c1>
<R>1.5</R>
</surface>
</surfaces>
</Roughness-Profile>
</Roughness-Profiles>
La sortie souhaitée doit être:
My CSV file:
id,x1,y1,z1,x2,y2,z2,c1,R
a1,1.3,2.1,3.6,4.5,5.1,6.8,B,7.3
b2,1.1,2.1,3.1,4.1,5.1,6.1,G,7.1
c1,2.1,3.1,4.1,5.1,2.1,7.1,G,8.1
a1,2.2,3.2,4.2,5.2,6.2,7.2,S,8.2
b2,4.1,5.1,2.1,7.1,8.1,9.1,S,2.5
b2,3.6,4.5,5.1,6.3,7.4,8.2,G,3.1
c2,6.1,7.1,8.1,9.1,2.1,11.1,S,3.2
c1,1.5,1.5,1.5,1.5,1.5,1.5,A,1.5
my code:
import itertools
import csv
import os
csvFile = r'C:\Users\Desktop\test XML\csvfile.csv'
xmlFile = r'C:\Users\Desktop\test XML\myData.xml'
csvData = csv.reader(open(csvFile))
xmlData = open(xmlFile, 'w')
xmlData.write('<?xml version="1.0" encoding="UTF-8"?>' + "\n" +'<Roughness-Profiles xmlns="http://WKI/Roughness-Profiles/1">' + "\n" )
xmlData.write(' '+'<Roughness-Profile>' + "\n")
rowNum = 0
for row in csvData:
if rowNum == 0:
tags = row
# replace spaces w/ underscores in tag names
for i in range(len(tags)):
tags[i] = tags[i].replace(' ', '_')
else:
xmlData.write(' '+'<surfaces>' +"\n"+' '+'<surface>' + "\n")
for i in range (len(tags)):
xmlData.write(' ' +'<' + tags[i] + '>' \
+ row[i] + '</' + tags[i] + '>' + "\n")
xmlData.write(' '+'</surface>' + "\n" + ' '+'</surfaces>' + "\n" + ' '+'</Roughness-Profile>' + "\n")
rowNum +=1
xmlData.write('</Roughness-Profiles>' + "\n")
xmlData.close()
p >
3 Réponses :
Commencez par lire toutes les lignes du CSV et triez-les.
Plus tard, vous pouvez utiliser la variable previous_id pour ouvrir et fermer les Rugosité-Profile / surfaces uniquement lorsque id dans la nouvelle ligne est différente de la précédente.
J'ai utilisé StringIO pour simuler le fichier csv et sys.stdout pour simuler le fichier xml - afin que tout le monde puisse copier code et exécutez-le pour voir comment cela fonctionne
import csv
csvFile = r'C:\Users\Desktop\test XML\csvfile.csv'
xmlFile = r'C:\Users\Desktop\test XML\myData.xml'
csvData = csv.reader(open(csvFile))
xmlData = open(xmlFile, 'w')
# read all data to sort them
csvData = list(csvData)
tags = [item.replace(' ', '_') for item in csvData[0]] # headers
csvData = sorted(csvData[1:]) # sort data without headers
xmlData.write('<?xml version="1.0" encoding="UTF-8"?>\n<Roughness-Profiles xmlns="http://WKI/Roughness-Profiles/1">\n')
previous_id = None
for row in csvData:
row_id = row[0]
if row_id != previous_id:
# close previous group - but only if it is not first group
if previous_id is not None:
xmlData.write('</surfaces>\n</Roughness-Profile>\n')
# open new group
xmlData.write('<Roughness-Profile>\n<id>{}</id>\n<surfaces>\n'.format(row_id))
# remeber new group's id
previous_id = row_id
# surface
xmlData.write('<surface>\n')
for value, tag in zip(row[1:], tags[1:]):
xmlData.write('<{}>{}</{}>\n'.format(tag, value, tag))
xmlData.write('</surface>\n')
# close last group
xmlData.write('</surfaces>\n</Roughness-Profile>\n')
xmlData.write('</Roughness-Profiles>\n')
xmlData.close()
Version sans StringIO et sys.stdout
XXX
Salut Furas, d'abord je ne comprends pas votre stringIO et sys.stdout. expliquez-le davantage afin que je puisse suivre. J'ai exécuté un script sans lignes stringIO et sys.stdout. Toutes les données sont dans l'ordre souhaité mais il manque l'analyse XML essentielle dans la sortie.
Premièrement: n'utilisez pas StringIO et sys.stdout - utilisez vos fichiers. J'ai utilisé StringIO et sys.stdout parce que je n'ai pas votre fichier et que j'ai dû le simuler. Et avec StringIO et sys.stdout, d'autres utilisateurs peuvent exécuter ce code et voir comment cela fonctionne - ils n'ont pas besoin de votre fichier avec des données.
maintenant je vois que j'ai oublié de fermer ''. Je l'ajoute maintenant. Le reste semble le même. J'ai utilisé le programme meld pour comparer votre sortie avec la mienne.
Je l'ai ajouté avant d'écrire le commentaire précédent.
Désolé, je n'ai pas accepté les modifications auparavant, donc je ne les ai pas ajoutées. Mais il n'y a qu'une seule ligne xmlData.write (' \ n') avant xmlData.close () . Maintenant, le changement est dans le code.
@ Furas, merci d'avoir changé le script. Le XML de sortie semble un peu différent de celui souhaité. je veux dire que toutes les lignes du xml de sortie commencent au début de la page. Dans la sortie souhaitée, il y a une indentation entre les éléments. J'ai chargé le xml de sortie dans l'éditeur xml et il indique que le XML est valide. Je vous ferai savoir lundi si le XML accepte ou non par le module?
Les analyseurs XML ne se soucient pas des espaces et des entrées. Vous pouvez avoir toutes les données même sur une seule ligne. Les espaces sont réservés aux personnes. Dans le code, vous pouvez ajouter autant d'espaces que vous le souhaitez.
@ Furaas- Merci pour la réponse rapide. je vous ferai savoir lundi
@ Furas - la sortie xml via votre script est bonne. Je n'ai eu aucun problème lors du chargement du xml dans le module., Merci encore une fois.
@ furas, j'ai une autre question, vous êtes peut-être intéressé voir le lien lien
Parce que les fichiers XML ne sont pas des fichiers texte mais des documents textuels spéciaux de données structurées conformes aux spécifications W3C , en évitant de construire le document par concaténation de chaînes.
À la place, utilisez les bibliothèques DOM appropriées disponibles dans pratiquement tous les langages de programmation modernes, y compris Python avec son xml.etree intégré ou un module tiers plus robuste, lxml . En fait, comme la sortie souhaitée implique le regroupement des nœuds par id , envisagez d'exécuter XSLT, le langage à usage spécial conçu pour transformer les fichiers XML. Le module lxml peut exécuter des scripts XSLT 1.0.
Ci-dessous utilise le DictReader du module intégré csv pour construire un dictionnaire d'id imbriqués (toutes les colonnes regroupées sous des clés d'id). Ensuite, XML est construit en itérant dans le contenu de ce dictionnaire pour écrire des données dans les nœuds d'élément.
<?xml version='1.0' encoding='UTF-8'?>
<R-Profiles xmlns="http://WKI/Roughness-Profiles/1">
<R-Profile>
<id>a1</id>
<surfaces>
<surface>
<x1>1.3</x1>
<y1>2.1</y1>
<z1>3.6</z1>
<x2>4.5</x2>
<y2>5.1</y2>
<z2>6.8</z2>
<c1>B</c1>
<R>7.3</R>
</surface>
<surface>
<x1>2.2</x1>
<y1>3.2</y1>
<z1>4.2</z1>
<x2>5.2</x2>
<y2>6.2</y2>
<z2>7.2</z2>
<c1>S</c1>
<R>8.2</R>
</surface>
</surfaces>
</R-Profile>
<R-Profile>
<id>b2</id>
<surfaces>
<surface>
<x1>1.1</x1>
<y1>2.1</y1>
<z1>3.1</z1>
<x2>4.1</x2>
<y2>5.1</y2>
<z2>6.1</z2>
<c1>G</c1>
<R>7.1</R>
</surface>
<surface>
<x1>4.1</x1>
<y1>5.1</y1>
<z1>2.1</z1>
<x2>7.1</x2>
<y2>8.1</y2>
<z2>9.1</z2>
<c1>S</c1>
<R>2.5</R>
</surface>
<surface>
<x1>3.6</x1>
<y1>4.5</y1>
<z1>5.1</z1>
<x2>6.3</x2>
<y2>7.4</y2>
<z2>8.2</z2>
<c1>G</c1>
<R>3.1</R>
</surface>
</surfaces>
</R-Profile>
<R-Profile>
<id>c1</id>
<surfaces>
<surface>
<x1>2.1</x1>
<y1>3.1</y1>
<z1>4.1</z1>
<x2>5.1</x2>
<y2>2.1</y2>
<z2>7.1</z2>
<c1>G</c1>
<R>8.1</R>
</surface>
<surface>
<x1>1.5</x1>
<y1>1.5</y1>
<z1>1.5</z1>
<x2>1.5</x2>
<y2>1.5</y2>
<z2>1.5</z2>
<c1>A</c1>
<R>1.5</R>
</surface>
</surfaces>
</R-Profile>
<R-Profile>
<id>c2</id>
<surfaces>
<surface>
<x1>6.1</x1>
<y1>7.1</y1>
<z1>8.1</z1>
<x2>9.1</x2>
<y2>2.1</y2>
<z2>11.1</z2>
<c1>S</c1>
<R>3.2</R>
</surface>
</surfaces>
</R-Profile>
</R-Profiles>
Input.csv
id,x1,y1,z1,x2,y2,z2,c1,R a1,1.3,2.1,3.6,4.5,5.1,6.8,B,7.3 b2,1.1,2.1,3.1,4.1,5.1,6.1,G,7.1 c1,2.1,3.1,4.1,5.1,2.1,7.1,G,8.1 a1,2.2,3.2,4.2,5.2,6.2,7.2,S,8.2 b2,4.1,5.1,2.1,7.1,8.1,9.1,S,2.5 b2,3.6,4.5,5.1,6.3,7.4,8.2,G,3.1 c2,6.1,7.1,8.1,9.1,2.1,11.1,S,3.2 c1,1.5,1.5,1.5,1.5,1.5,1.5,A,1.5
Output.xml
import csv
from collections import OrderedDict
import lxml.etree as ET
# BUILD NESTED ID DICTIONARY FROM CSV
with open("Input.csv") as f:
reader = csv.DictReader(f)
id_dct = OrderedDict({})
for dct in reader:
if dct["id"] not in id_dct.keys():
id_dct[dct["id"]] = [OrderedDict({k:v for k,v in dct.items() if k!= "id"})]
else:
id_dct[dct["id"]].append(OrderedDict({k:v for k,v in dct.items() if k!= "id"}))
# INITIALIZING XML FILE WITH ROOT AND NAMESPACE
root = ET.Element('R-Profiles', nsmap={None: "http://WKI/Roughness-Profiles/1"})
# WRITING TO XML NODES
for k,v in id_dct.items():
rpNode = ET.SubElement(root, "R-Profile")
ET.SubElement(rpNode, "id").text = str(k)
surfacesNode = ET.SubElement(rpNode, "surfaces")
for dct in v:
surfaceNode = ET.SubElement(surfacesNode, "surface")
for k,v in dct.items():
ET.SubElement(surfaceNode, k).text = str(v)
# OUTPUT XML CONTENT TO FILE
tree_out = ET.tostring(root, pretty_print=True, xml_declaration=True, encoding="UTF-8")
with open('Output.xml','wb') as f:
f.write(tree_out)
Merci Parfait, Dans le fichier de sortie le "id" n'est pas au bon endroit.
J'ai mal lu votre réel pour la sortie souhaitée. Voir modifier la création d'un dictionnaire d'identifiants et l'itération de son contenu.
@Parafait, Merci pour le conseil, pouvez-vous changer le script pour que je puisse mieux comprendre.
@Ram, que vous faut-il de plus? J'inclus des commentaires en ligne.
@Parafiat, merci encore. Toutes les choses principales semblent bonnes sauf un couple de petites choses. les éléments de surface ne sont pas dans l'ordre si exécutez le script que j'obtiens - x1, y2, x2, z2, R, c1, z1, y1. L'ordre devrait être - x1, y1, z1, x2, y2, z2, c1, R. Est-il possible de définir l'ordre des colonnes au lieu d'itérer toutes les colonnes? et le suivant est-il possible de trier le "id"?
Hmmm ... comme vous pouvez le voir avec ma sortie et après re-vérification, je ne reçois pas une telle commande. Êtes-vous sûr que le code que vous avez tenté reflète cette solution (sans aucune modification) et que le CSV ressemble à celui que vous avez publié? J'utilise Python 3.7 qui commande maintenant des dictionnaires. Il se peut que nous devions utiliser OrderedDict .
@ Parfait- Merci pour votre réaction, j'utilise Python 2.7 peut-être que cela pourrait être la raison. oui l'ordre des balises de surface sont dans l'ordre. il se peut que dans le script, je puisse le donner pour chaque index de colonne ou comme vous l'avez suggéré d'utiliser OrderedDict.
Voir la modification à l'aide de OrderedDict . Notez la ligne import ajoutée du module collections intégré.
@ Parfait- étonnamment rien n'est changé quand même, je veux dire pas dans le bon ordre
@ Parfait- je viens de le remarquer. son problème de version Python, en Python3 il fonctionne bien et en Python2 non.
Correct. Depuis Python 3.7, les dictionnaires conservent désormais l'ordre d'insertion. OrderedDict n'a-t-il pas été résolu dans Python 2?
@ Parfait- Non, dans Python 2, je ne suis pas dans le bon ordre avec OrderedDict.
Intéressant! DictReader peut alors se comporter différemment dans Python 2.
, J'ai une autre question, peut-être que vous êtes intéressé voir le lien lien
Je ferais quelque chose de très similaire à ce que @Parfait a suggéré; utilisez csv.DictReader et lxml pour créer le XML.
Cependant, il manque quelque chose dans cette réponse; les éléments surface ne sont pas regroupés par id .
Si j'ai besoin de regrouper XML pendant une transformation, la première chose à laquelle je pense est XSLT.
Une fois que vous avez compris, le regroupement est facile avec XSLT; en particulier 2.0 ou plus. Malheureusement, lxml ne prend en charge que XSLT 1.0. Dans la version 1.0, vous devez utiliser Muenchian Grouping .
Voici un exemple complet de création d'un XML intermédiaire et de sa transformation avec XSLT.
Entrée CSV (test.csv)
<?xml version="1.0"?>
<Roughness-Profiles xmlns="http://WKI/Roughness-Profiles/1">
<Roughness-Profile>
<id>a1</id>
<surfaces>
<surface>
<x1>1.3</x1>
<y1>2.1</y1>
<z1>3.6</z1>
<x2>4.5</x2>
<y2>5.1</y2>
<z2>6.8</z2>
<c1>B</c1>
<R>7.3</R>
</surface>
<surface>
<x1>2.2</x1>
<y1>3.2</y1>
<z1>4.2</z1>
<x2>5.2</x2>
<y2>6.2</y2>
<z2>7.2</z2>
<c1>S</c1>
<R>8.2</R>
</surface>
</surfaces>
</Roughness-Profile>
<Roughness-Profile>
<id>b2</id>
<surfaces>
<surface>
<x1>1.1</x1>
<y1>2.1</y1>
<z1>3.1</z1>
<x2>4.1</x2>
<y2>5.1</y2>
<z2>6.1</z2>
<c1>G</c1>
<R>7.1</R>
</surface>
<surface>
<x1>4.1</x1>
<y1>5.1</y1>
<z1>2.1</z1>
<x2>7.1</x2>
<y2>8.1</y2>
<z2>9.1</z2>
<c1>S</c1>
<R>2.5</R>
</surface>
<surface>
<x1>3.6</x1>
<y1>4.5</y1>
<z1>5.1</z1>
<x2>6.3</x2>
<y2>7.4</y2>
<z2>8.2</z2>
<c1>G</c1>
<R>3.1</R>
</surface>
</surfaces>
</Roughness-Profile>
<Roughness-Profile>
<id>c1</id>
<surfaces>
<surface>
<x1>2.1</x1>
<y1>3.1</y1>
<z1>4.1</z1>
<x2>5.1</x2>
<y2>2.1</y2>
<z2>7.1</z2>
<c1>G</c1>
<R>8.1</R>
</surface>
<surface>
<x1>1.5</x1>
<y1>1.5</y1>
<z1>1.5</z1>
<x2>1.5</x2>
<y2>1.5</y2>
<z2>1.5</z2>
<c1>A</c1>
<R>1.5</R>
</surface>
</surfaces>
</Roughness-Profile>
<Roughness-Profile>
<id>c2</id>
<surfaces>
<surface>
<x1>6.1</x1>
<y1>7.1</y1>
<z1>8.1</z1>
<x2>9.1</x2>
<y2>2.1</y2>
<z2>11.1</z2>
<c1>S</c1>
<R>3.2</R>
</surface>
</surfaces>
</Roughness-Profile>
</Roughness-Profiles>
XSLT 1.0 (test.xsl)
import csv
import lxml.etree as etree
# INITIALIZING XML FILE WITH ROOT IN PROPER NAMESPACE
nsmap = {None: "http://WKI/Roughness-Profiles/1"}
root = etree.Element('Roughness-Profiles', nsmap=nsmap)
# READING CSV FILE
with open("test.csv") as f:
reader = csv.DictReader(f)
# WRITE INITIAL XML NODES
for row in reader:
surface_elem = etree.SubElement(root, "surface", nsmap=nsmap)
for elem_name, elem_value in row.items():
etree.SubElement(surface_elem, elem_name.strip(), nsmap=nsmap).text = str(elem_value)
# PARSE XSLT AND CREATE TRANSFORMER
xslt_root = etree.parse("test.xsl")
transform = etree.XSLT(xslt_root)
# TRANSFORM
# (Note the weird use of tostring/fromstring. This was used so
# namespaces in the XSLT would work the way they're supposed to.)
final_xml = transform(etree.fromstring(etree.tostring(root)))
# WRITE OUTPUT TO FILE
final_xml.write_output("test.xml")
Python
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rp="http://WKI/Roughness-Profiles/1">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="surface" match="rp:surface" use="rp:id"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="rp:surface[count(.|key('surface',rp:id)[1])=1]">
<xsl:element name="Roughness-Profile" namespace="http://WKI/Roughness-Profiles/1">
<xsl:copy-of select="rp:id"/>
<xsl:element name="surfaces" namespace="http://WKI/Roughness-Profiles/1">
<xsl:apply-templates select="key('surface',rp:id)"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="rp:id"/>
</xsl:stylesheet>
Sortie XML (test.xml)
id,x1,y1,z1,x2,y2,z2,c1,R a1,1.3,2.1,3.6,4.5,5.1,6.8,B,7.3 b2,1.1,2.1,3.1,4.1,5.1,6.1,G,7.1 c1,2.1,3.1,4.1,5.1,2.1,7.1,G,8.1 a1,2.2,3.2,4.2,5.2,6.2,7.2,S,8.2 b2,4.1,5.1,2.1,7.1,8.1,9.1,S,2.5 b2,3.6,4.5,5.1,6.3,7.4,8.2,G,3.1 c2,6.1,7.1,8.1,9.1,2.1,11.1,S,3.2 c1,1.5,1.5,1.5,1.5,1.5,1.5,A,1.5
Salut Daniel, votre conseil fonctionne bien. Cela fonctionne pour cet exemple de fichier, mais si j'exécute le script, j'obtiens à la «ligne 16», ValueError: nom de balise invalide.Vous avez une idée de comment se débarrasser de son erreur?
@Ram - Cela signifie qu'une de vos valeurs d'en-tête ne peut pas être utilisée telle quelle pour un nom d'élément. Pouvez-vous me dire à quoi ressemble la première ligne pour que je puisse suggérer une solution?
@Ram - Ce sont tous des noms valides tant qu'il n'y a pas d'espaces de début / de fin. J'ai ajouté strip () à elem_name dans le Python ( elem_name.strip () ). Essayez-le et faites-moi savoir si cela résout le problème.
@Ram - J'ai également supprimé du code de débogage du XSLT. Oops. :-)
tout semble être bon sauf quelques petites choses, je viens de remarquer dans la première ligne que j'ai raté le 'encoding = "UTF-8"? 'et le suivant est le if exécutez le script que j'obtiens - x1, y2, x2, z2, R, c1, z1, y1. L'ordre devrait être - x1, y1, z1, x2, y2, z2, c1, R. Est-il possible de définir l'ordre des colonnes en indexant je veux dire au lieu d'itérer toutes les colonnes? et le suivant est-il possible de trier le "id"?
J'utilise Python 2.7 peut-être que cela pourrait être la raison?
commencez par lire toutes les lignes de
CSVet triez-les paridce n'est pas du tout le problème. les mêmes identifiants doivent être regroupés, voir la structure xml dans la sortie souhaitée
le regroupement n'est pas un problème