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

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
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).
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 moment de 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 ...