Bonjour,
Je souhaiterais améliorer un code qui transforme un fichier CSV en XML.
Le fichier CSV d'entrée original était organisé comme ceci :
Point___ ; Pt_1__; 01/02/2013 ; X_Pt_1 ; Y_Pt_1 ; Z_Pt_1
Segment ; Seg_1 ; 11/02/2013 ; X_Pt_2 ; Y_Pt_2 ; Z_Pt_2 ; X_Pt_3 ; Y_Pt_3 ; Z_Pt_3
Point___ ; Pt_2__; 02/02/2013 ; X_Pt_4 ; Y_Pt_4 ; Z_Pt_4
Segment ; Seg_2 ; 12/02/2013 ; X_Pt_5 ; Y_Pt_5 ; Z_Pt_5 ; X_Pt_6 ; Y_Pt_6 ; Z_Pt_6
Sur une précédente discussion, "chrismonoye"m'avait gentiment aidé à réaliser le code suivant. Ce code ajoute des balises « Abscisse », « Ordonnée » et « Hauteur » s'il est indiqué dans l'enregistrement du fichier CSV qu'il s'agit d'un "Segment" (à 2 points) :
Mon problème est que je voudrais avoir la possibilité de traiter jusqu’aux Lignes brisées (plus de 2 coordonnées/hauteur par objet).
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 Public Sub ObjetsXML() 'Lire le fichier CSV d'entrée qui contient les informations sur les objets Dim FileContent As String() = File.ReadAllLines("C:\Test.csv") 'Définir la structure XML du fichier de sortie 'en ajoutant des balises si le type d'objet est un "Segment" Dim StructureXML As XElement = New XElement("Bd_Objets", _ New XElement("Titre", "Objets_2013"), _ New XElement("Date", "11/02/2013"), _ New XElement("Auteur", "Docteur26"), _ From items In FileContent Let fields = items.Split(";"c) Select _ New XElement("Objet", _ New XElement("Nom", fields(1)), _ New XElement("DateDeCreation", fields(2)), _ New XElement("Type", fields(0)), _ New XElement("Caracteristiques", _ New XElement("Coordonnees", _ New XElement("Abscisse", fields(3)), _ New XElement("Ordonnee", fields(4))), _ New XElement("Hauteur", fields(5))), _ If(fields(0) = "Segment", _ New XElement("Caracteristiques", _ New XElement("Coordonnees", _ New XElement("Abscisse", fields(6)), _ New XElement("Ordonnee", fields(7))), _ New XElement("Hauteur", fields(8))), _ Nothing), _ New XElement("Origine"))) 'Ecrire le fichier XML de sortie File.WriteAllText("C:\Test.xml", StructureXML.ToString) 'Remplacer du texte dans le fichier XML de sortie (en écrasant le "FichierEntree" par le "FichierSortie") Dim fso As Object Dim FichierEntree As Object Dim FichierSortie As Object Dim TexteXML As String fso = CreateObject("Scripting.FileSystemObject") FichierEntree = fso.OpenTextFile("C:\Test.xml", 1) TexteXML = FichierEntree.ReadAll TexteXML = Replace(TexteXML, "<Bd_Objets>", "<Bd_Objets xmlns=""http://www.monsite.com"">") FichierSortie = fso.CreateTextFile("C:\Test.xml", True) FichierSortie.Writeline("<?xml version=""1.0"" encoding=""UTF-8"" ?>") FichierSortie.Write(TexteXML) End Sub
Pour ne pas multiplier les colonnes en fonction du nombre de points constituant la Ligne brisée (qui peut être important), j'ai modifié mon fichier CSV et il possède maintenant uniquement les champs suivants : « Type »;« Nom »;« Date »;« Abscisse »;« Ordonnée »;« Hauteur »
Maintenant, pour caractériser une ligne (ou un segment) dans le fichier CSV, cela se fait obligatoirement sur plusieurs lignes :
Point ; Pt_ 1 ; 01/02/2013 ; X_Pt_1 ; Y_Pt_1 ; Z_Pt_1
Ligne ; Lig_1 ; 11/02/2013 ; X_Pt_2 ; Y_Pt_2 ; Z_Pt_2
Ligne ; Lig_1 ; 11/02/2013 ; X_Pt_3 ; Y_Pt_3 ; Z_Pt_3
Ligne ; Lig_2 ; 12/02/2013 ; X_Pt_4 ; Y_Pt_4 ; Z_Pt_4
Ligne ; Lig_1 ; 11/02/2013 ; X_Pt_5 ; Y_Pt_5 ; Z_Pt_5
Ligne ; Lig_1 ; 11/02/2013 ; X_Pt_6 ; Y_Pt_6 ; Z_Pt_6
Ligne ; Lig_1 ; 11/02/2013 ; X_Pt_7 ; Y_Pt_7 ; Z_Pt_7
J'essaye depuis un momentde modifier le code de "chrismonoye" pour que lorsque les champs d'un enregistrement du CSV : « Type », « Nom » et « Date » sont vides, il aille ajouter des balises « Abscisse », « Ordonnée » et « Hauteur » à l'enregistrement précédent qui a le type "Ligne". Mais là, je sèche !
Voilà, désolé d'avoir était aussi long, mais j’espère avoir correctement décrit ce que je souhaitais faire.
De plus, comme dans mes précédents Posts, je précise que je suis débutant ...![]()
Partager