IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Exportation d'un CSV en XML [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Utilisation Privé de VB.NET
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Utilisation Privé de VB.NET

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Par défaut Exportation d'un CSV en XML
    Bonjour,
    J'ai récemment fait appel au Forum pour résoudre un problème et je ne l'ai pas regretté puisque "Sankasssss" m'a apporté la solution (encore merci ! ).
    Je suis toujours en cours de rédaction d’un code en VB.NET qui me permettrait d’exporter les données d’un fichier CSV en fichier XML.
    Pour l’instant le code ci-dessous me permet de le faire mais seulement avec une structure XML unique (non adaptative).
    Le fichier CSV possède les champs suivants : « Nom »;« Type »;« Abscisse1 »;« Ordonnée1 »;« Abscisse2 »;« Ordonnée2 »

    Lorsque le Type est « POINT», il ne nécessite qu’un seul champ Abscisse et Ordonnée, ce qui donne :

    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
    Private Sub CsvToXml()
     
            Dim CheminFichierSource As String = "C:/Test.csv" 'Chemin du fichier CSV
            Dim CheminFichierXML As String = "C:/Test.xml" 'Chemin du fichier XML
            Dim TexteCSV As String() 'Texte du Fichier source
            Dim StructureXML As XElement 'Structure XML à générer
     
            'Déclarer le flux de fichier en mode "Création" (Fichier XML) pour écraser éventuellement
            'le fichier qui porterait le même nom (partir d'un fichier vide avant son remplissage)
            'puis le fermer
            Dim CreerFichierXML As New FileStream(CheminFichierXML, FileMode.Create)
            CreerFichierXML.Close()
     
            'Affecter à la variable "TexteCSV" le contenu du Fichier source
            TexteCSV = File.ReadAllLines(CheminFichierSource)
     
            'Déclarer le flux de fichier en mode "Ecriture" (Fichier XML)
            Dim EcrireFichierXML As New StreamWriter(CheminFichierXML)
     
            'Affecter à la variable "StructureXML" la structure XML pour un Type POINT
            StructureXML = _
                <Root>
                    <%= From strs In TexteCSV _
                        Let fields = Split(strs, ";") _
                        Select _
                        <Geometrie>
                            <Nom><%= fields(0) %></Nom>
                            <Type><%= fields(1) %></Type>
                            <Caracteristiques>
                                 <Coordonnees>
                                     <Abscisse><%= fields(2) %></Abscisse>
                                     <Ordonnee><%= fields(3) %></Ordonnee>
                                 </Coordonnees>
                            </Caracteristiques>
                        </ Geometrie >
                    %>
                </Root>
     
            'Ecrire le fichier XML puis fermer le fichier
            EcrireFichierXML.WriteLine(StructureXML)
            EcrireFichierXML.Close()
     
        End Sub
    Maintenant, ce que je voudrais faire : c'est que lorsque le Type (dans une ligne du fichier CSV) est « SEGMENT », la structure XML s'adapte et devienne celle-ci :

    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
     
            'Affecter à la variable "StructureXML" la structure XML pour un Type SEGMENT
            StructureXML = _
                <Root>
                    <%= From strs In TexteCSV _
                        Let fields = Split(strs, ";") _
                        Select _
                        <Geometrie>
                            <Nom><%= fields(0) %></Nom>
                            <Type><%= fields(1) %></Type>
                            <Caracteristiques>
                                 <Coordonnees>
                                     <Abscisse><%= fields(2) %></Abscisse>
                                     <Ordonnee><%= fields(3) %></Ordonnee>
                                 </Coordonnees>
                            </Caracteristiques>
                            <Caracteristiques>
                                 <Coordonnees>
                                     <Abscisse><%= fields(4) %></Abscisse>
                                     <Ordonnee><%= fields(5) %></Ordonnee>
                                 </Coordonnees>
                            </Caracteristiques>
                        </ Geometrie >
                    %>
                </Root>
    Voilà, je ne sais pas si plusieurs structures XML peuvent être ainsi déclarées à partir de la transformation d'un seul fichier CSV.
    Merci de m'éclairer s'il existe une solution simple (je suis débutant ...)

  2. #2
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut Ajout de l'id de la structure dans la balise CODE => [CODE=xml]
    Moi je verrais plus un truc du genre :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <Caracteristiques>
                                 <Coordonnees>
                                     <Abscisse><%= fields(2) %></Abscisse>
                                     <Ordonnee><%= fields(3) %></Ordonnee>
                                 </Coordonnees>
                                 <Coordonnees>
                                     <Abscisse><%= fields(4) %></Abscisse>
                                     <Ordonnee><%= fields(5) %></Ordonnee>
                                 </Coordonnees>
    </Caracteristiques>
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Membre averti
    Homme Profil pro
    Utilisation Privé de VB.NET
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Utilisation Privé de VB.NET

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Par défaut
    En fait, ces 2 structures XML (selon le type POINT ou SEGMENT) me sont imposées.
    En effet, le fichier XML (généré par mon code VB.NET) est ensuite importé par un logiciel qui traite les données.
    Je dois donc pouvoir remplir la structure XML en fonction du Type spécifié dans les lignes de mon fichier CSV.
    Mais peut être que ce que je veux faire n'est pas possible ?

  4. #4
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    J'en suis pas sur je n'ai jamais vraiment testé ce point, mais je suis intéresse par la réponse.
    Je pense toutefois pour les exemples que j'ai déjà vu (et réalisé au bureau mais en vb6) que cela devrait fonctionner. Tu peux toujours faire un XML "à la main" et le passer au logiciel "destinataire" pour voir s'il y a erreur ou non
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 81
    Par défaut
    Et ceci ?

    -Avoir 2 fonctions qui créent un XElement en prenant en paramètre une ligne du fichier CSV, genre CreerXElementPoint(ligne) et CreerXElementSegment(ligne).

    -Récupérer les lignes du fichier CSV et boucler dessus en testant si la ligne contient le mot Point ou Segment (enfin, le champ discriminant en somme).

    -Appeler la méthode adéquate en fonction du type de coordonnées.

    -Ajouter l'élément renvoyé à la racine de ton document.

    Une autre solution équivalente, au lieu d'avoir 2 fonctions, c'est faire 2 sub AjouterXElementPoint(ligne, racine) et AjouterXElementSegment(ligne, racine). Et dans la sub, tu fais l'ajout directement à la racine.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    à tester si cela peut vous convenir :
    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
        Public Sub ConvertCSVToXML()
     
            Dim FileContent As String() = File.ReadAllLines(depuisFichierCSV)
     
            Dim StructXML As New XElement("Root", From items In FileContent _
                                            Let fields = items.Split(";"c) _
                                            Select New XElement("Geometrie", _
                                                           New XElement("Nom", fields(0)), _
                                                           New XElement("Type", fields(1)), _
                                                           New XElement("Caracteristiques", _
                                                                  New XElement("Coordonnees", _
                                                                       New XElement("Abscisse", fields(2)), _
                                                                       New XElement("Ordonnee", fields(3)))), _
                                                           If(fields(1) = "SEGMENT", _
                                                               New XElement("Caracteristiques", _
                                                                  New XElement("Coordonnees", _
                                                                       New XElement("Abscisse", fields(4)), _
                                                                       New XElement("Ordonnee", fields(5)))), _
                                                                       Nothing)))
     
     
            File.WriteAllText(versFichierXML, StructXML.ToString)
     
        End Sub
    A chaque ligne, on créé l'arborescence pour les champs 0, 1, 2, 3.
    Si le champs 1 est SEGMENT, on ajoute la branche pour les champs 4 et 5.

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Pourquoi ne pas utiliser la sérialisation xml tu crée un objet correspondant à ce que tu veux en sortie et tu l'affecte dans la lecture de ton CSV, tu auras juste à faire un serialize pour créer ton xml.
    Et si tu as l'xsd tu peux directement générer tes classes.

  8. #8
    Membre averti
    Homme Profil pro
    Utilisation Privé de VB.NET
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Utilisation Privé de VB.NET

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Par défaut
    Merci à tous pour vos réponses, même si mon niveau en programmation ne m'a pas permis de comprendre la proposition de "youtpout978"
    Sinon, la solution de "chrismonoye" répond parfaitement à ma problématique de départ et je l'en remercie d'autant plus
    C'est aussi la raison pour laquelle, je n'ai pas entrepris la solution de "Sokhz" qui, je le pense, devrait fonctionner mais avec plus de code.
    Enfin pour "infosam76", dés que je le peux je ferai l'essai de la structure XML simplifiée pour vérifier si mon logiciel qui importe le fichier l'accepte ou pas.
    Merci encore et bonne soirée.

  9. #9
    Membre averti
    Homme Profil pro
    Utilisation Privé de VB.NET
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Utilisation Privé de VB.NET

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Par défaut Réponse à "infosam76"
    Ça y est, j'ai eu enfin le temps de faire l'essai avec la structure XML simplifiée que tu avais proposée.
    Malheureusement, le logiciel qui importe le fichier XML refuse d'importer cette structure XML sans les balises :
    </Caracteristiques>
    <Caracteristiques>
    entre les deux "coordonnées".
    Voilà pour la réponse que tu attendais.
    Bon week-end.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Amélioration d'une Exportation CSV vers XML
    Par Docteur26 dans le forum VB.NET
    Réponses: 6
    Dernier message: 14/02/2013, 20h37
  2. Réponses: 0
    Dernier message: 27/06/2012, 16h00
  3. Export fichier format autre que CSV et XML
    Par dbaenbois dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 21/07/2009, 21h45
  4. [RegEx] Exporter un tableau HTML en XML/XLS
    Par wishmastah dans le forum Langage
    Réponses: 1
    Dernier message: 15/05/2006, 13h41
  5. Export de table au format XML
    Par Tieri dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo