1. #1
    Nouveau Candidat au Club Avatar de Exulan
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : juillet 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut Conversion csv to xml sur plusieurs niveaux.

    Bonjour,

    J'aimerais convertir un fichier csv de factures en fichier xml,

    Voici la structure de ce fichier csv:

    numeroFactureSaisi;dateFacture;deviseFacture;typeFacture;typeTva;
    numeroMarche;numeroBonCommande;numeroFactureOrigine;modePaiement;lignePosteNumero;
    lignePosteReference;lignePosteDenomination;lignePosteQunatite;lignePosteUnite;lignePosteMontantUnitaireHT;
    lignePosteMontantRemiseHT;lignePosteTauxTva;ligneTvaTaux;ligneTvaMontantBaseHtParTaux;ligneTvaMontantTvaParTaux;
    montantHtTotal;montantTVA;montantTtcTotal;montantRemiseGlobalTTC;montantAPayer;
    commentaire

    Voici un exemple de ce fichier csv:

    49;2625017600****;SERVICE;54 208 370 *** ***;A1_FACTURE_FOURNISSEUR;49500****;03/03/2014;EUR;FACTURE;TVA_SUR_DEBIT;250562117****;BON N°2;0;VIREMENT;2;FRAISGAO;FRAIS D'EXPEDITION;1;Pièce;22,58;0;2;2;22,58;4,43;1529,69;87,32;1617,01;0;1617,01;
    49;2625017600****;SERVICE;54 208 370 *** ***;A1_FACTURE_FOURNISSEUR;49500****;06/04/2017;EUR;FACTURE;TVA_SUR_DEBIT;250562117****;BON N°3;0;VIREMENT;1;TR39N50;ORTHESE SANS ARMATURE BIVALVE;1;Pièce;924,38;0;1;1;1029,74;56,64;1029,74;56,64;1086,38;0;1086,38;
    49;2625017600****;SERVICE;54 208 370 *** ***;A1_FACTURE_FOURNISSEUR;49500****;06/04/2017;EUR;FACTURE;TVA_SUR_DEBIT;250562117****;BON N°4;0;VIREMENT;2;T39P01;MOULAGE TORSE;1;Pièce;105,36;0;1;1;1029,74;56,64;1029,74;56,64;1086,38;0;1086,38;
    49;2625017600****;SERVICE;54 208 370 *** ***;A1_FACTURE_FOURNISSEUR;49500****;12/07/2017;EUR;FACTURE;TVA_SUR_DEBIT;250562117****;BON N°5;0;VIREMENT;2;TR39N50;ORTHESE SANS ARMATURE BIVALVE;1;Pièce;924,38;0;1;1;1029,74;56,64;1029,74;56,64;1086,38;0;1086,38;Commentaires
    49;2625017600****;SERVICE;54 208 370 *** ***;A1_FACTURE_FOURNISSEUR;49500****;12/07/2017;EUR;FACTURE;TVA_SUR_DEBIT;250562117****;BON N°6;0;VIREMENT;3;T39P01;MOULAGE TORSE;1;Pièce;105,36;0;1;1;1029,74;56,64;1029,74;56,64;1086,38;0;1086,38;Commentaires
    49;2625017600****;SERVICE;54 208 370 *** ***;A1_FACTURE_FOURNISSEUR;49500****;12/07/2017;EUR;FACTURE;TVA_SUR_DEBIT;250562117****;BON N°7;0;VIREMENT;1;TR39N50;ORTHESE SANS ARMATURE BIVALVE;1;Pièce;924,38;0;1;1;1029,74;56,64;1029,74;56,64;1086,38;0;1086,38;
    49;2625017600****;SERVICE;54 208 370 *** ***;A1_FACTURE_FOURNISSEUR;49500****;12/07/2017;EUR;FACTURE;TVA_SUR_DEBIT;250562117****;BON N°8;0;VIREMENT;2;T39P01;MOULAGE TORSE;1;Pièce;105,36;0;1;1;1029,74;56,64;1029,74;56,64;1086,38;0;1086,38;

    J'arrive à le convertir de cette façon:

    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
    //Lecture dans un tableau de string
                string[] source = File.ReadAllLines("Exemple Fichier.csv");
                XElement fac = new XElement("Root",
                    from str in source
                    let fields = str.Split(';')
                    select new XElement("Facture",
                        new XElement("Site", fields[0]),
                        new XElement("codeDestinataire", fields[1]),
                        new XElement("codeServiceExecutant", fields[2]),
                        new XElement("idFournisseur", fields[3]),
                        new XElement("codeCadreFacturation", fields[4]),
                        new XElement("numeroFactureSaisi", fields[5]),
                        new XElement("dateFacture", fields[6]),
                        new XElement("deviseFacture", fields[7]),
                        new XElement("typeFacture", fields[8]),
                        new XElement("typeTva", fields[9]),
                        new XElement("numeroMarche", fields[10]),
                        new XElement("numeroBonCommande", fields[11]),
                        new XElement("numeroFactureOrigine", fields[12]),
                        new XElement("modePaiement", fields[13]),
                        new XElement("lignePoste",
                            new XElement("lignePosteNumero", fields[14]),
                            new XElement("lignePosteReference", fields[15]),
                            new XElement("lignePosteDenomination", fields[16]),
                            new XElement("lignePosteQunatite", fields[17]),
                            new XElement("lignePosteUnite", fields[18]),
                            new XElement("lignePosteMontantUnitaireHT", fields[19]),
                            new XElement("lignePosteMontantRemiseHT", fields[20]),
                            new XElement("lignePosteTauxTva", fields[21]),
                            new XElement("ligneTvaTaux", fields[22]),
                            new XElement("ligneTvaMontantBaseHtParTaux", fields[23]),
                            new XElement("ligneTvaMontantTvaParTaux", fields[24])
                            ),
                        new XElement("montantHtTotal", fields[25]),
                        new XElement("montantTVA", fields[26]),
                        new XElement("montantTtcTotal", fields[27]),
                        new XElement("montantRemiseGlobalTTC", fields[28]),
                        new XElement("montantAPayer", fields[29]),
                        new XElement("commentaire", fields[30])
                    )
                );
    Puis j'arrive à lire des informations ciblées par ce moyen:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //je récupère la conversion xml sous forme de texte car j'utilise par la suite WCF qui ne serialize pas les XDocument, mais le problème n'est pas là
                var fichier = fac.ToString();
     
                using (XmlReader reader = XmlReader.Create(new StringReader(fichier)))
                {
                    while (reader.Read())
                    {
                        //un exemple d' "information ciblée"
                        reader.Name.Equals("numeroFactureSaisi");                    
                    }
                }
    Mon problème est le suivant, le fichier csv est fait d'une telle façon qu'à chaque nouvelle ligne de commande appartenant à une même facture, cette nouvelle ligne de commande se retrouve dans la prochaine facture/ligne(du fichier csv), au "niveau" suivant dans le fichier xml.
    J'aimerais reconstruire mon xml de façon à ce que chaque facture ai toutes ses lignes de commandes à la suite.

    Voici un extrait du fichier xml converti d'une facture avec deux lignes de commandes afin d’illustrer mes propos:
    (Je précise que les deux factures ci-dessous n'en sont en fait qu'une seule.)
    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
    <Root>
      <Facture>
        <Site>49</Site>
        <codeDestinataire>2625017600****</codeDestinataire>
        <codeServiceExecutant>SERVICE</codeServiceExecutant>
        <idFournisseur>54 208 370 *** ***</idFournisseur>
        <codeCadreFacturation>A1_FACTURE_FOURNISSEUR</codeCadreFacturation>
        <numeroFactureSaisi>49500****</numeroFactureSaisi>
        <dateFacture>03/03/2014</dateFacture>
        <deviseFacture>EUR</deviseFacture>
        <typeFacture>FACTURE</typeFacture>
        <typeTva>TVA_SUR_DEBIT</typeTva>
        <numeroMarche>250562117****</numeroMarche>
        <numeroBonCommande>BON N&#65533;1</numeroBonCommande>
        <numeroFactureOrigine>0</numeroFactureOrigine>
        <modePaiement>VIREMENT</modePaiement>
        <lignePoste>
          <lignePosteNumero>1</lignePosteNumero>
          <lignePosteReference>BABICOC</lignePosteReference>
          <lignePosteDenomination>MATELAS POSITIONNEMENT BABICOC</lignePosteDenomination>
          <lignePosteQunatite>1</lignePosteQunatite>
          <lignePosteUnite>Pi&#65533;ce</lignePosteUnite>
          <lignePosteMontantUnitaireHT>1507,11</lignePosteMontantUnitaireHT>
          <lignePosteMontantRemiseHT>0</lignePosteMontantRemiseHT>
          <lignePosteTauxTva>1</lignePosteTauxTva>
          <ligneTvaTaux>1</ligneTvaTaux>
          <ligneTvaMontantBaseHtParTaux>1507,11</ligneTvaMontantBaseHtParTaux>
          <ligneTvaMontantTvaParTaux>82,89</ligneTvaMontantTvaParTaux>
        </lignePoste>
        <montantHtTotal>1529,69</montantHtTotal>
        <montantTVA>87,32</montantTVA>
        <montantTtcTotal>1617,01</montantTtcTotal>
        <montantRemiseGlobalTTC>0</montantRemiseGlobalTTC>
        <montantAPayer>1617,01</montantAPayer>
        <commentaire></commentaire>
      </Facture>
      <Facture>
        <Site>49</Site>
        <codeDestinataire>2625017600****</codeDestinataire>
        <codeServiceExecutant>SERVICE</codeServiceExecutant>
        <idFournisseur>54 208 370 *** ***</idFournisseur>
        <codeCadreFacturation>A1_FACTURE_FOURNISSEUR</codeCadreFacturation>
        <numeroFactureSaisi>49500****</numeroFactureSaisi>
        <dateFacture>03/03/2014</dateFacture>
        <deviseFacture>EUR</deviseFacture>
        <typeFacture>FACTURE</typeFacture>
        <typeTva>TVA_SUR_DEBIT</typeTva>
        <numeroMarche>250562117****</numeroMarche>
        <numeroBonCommande>BON N&#65533;2</numeroBonCommande>
        <numeroFactureOrigine>0</numeroFactureOrigine>
        <modePaiement>VIREMENT</modePaiement>
        <lignePoste>
          <lignePosteNumero>2</lignePosteNumero>
          <lignePosteReference>FRAISGAO</lignePosteReference>
          <lignePosteDenomination>FRAIS D'EXPEDITION</lignePosteDenomination>
          <lignePosteQunatite>1</lignePosteQunatite>
          <lignePosteUnite>Pi&#65533;ce</lignePosteUnite>
          <lignePosteMontantUnitaireHT>22,58</lignePosteMontantUnitaireHT>
          <lignePosteMontantRemiseHT>0</lignePosteMontantRemiseHT>
          <lignePosteTauxTva>2</lignePosteTauxTva>
          <ligneTvaTaux>2</ligneTvaTaux>
          <ligneTvaMontantBaseHtParTaux>22,58</ligneTvaMontantBaseHtParTaux>
          <ligneTvaMontantTvaParTaux>4,43</ligneTvaMontantTvaParTaux>
        </lignePoste>
        <montantHtTotal>1529,69</montantHtTotal>
        <montantTVA>87,32</montantTVA>
        <montantTtcTotal>1617,01</montantTtcTotal>
        <montantRemiseGlobalTTC>0</montantRemiseGlobalTTC>
        <montantAPayer>1617,01</montantAPayer>
        <commentaire></commentaire>
      </Facture>
    Dites moi si vous ne m'avez pas compris j'essaierai d'être plus précis.

    Merci d'avance si réponse il y a.

  2. #2
    Membre expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    octobre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 504
    Points : 3 096
    Points
    3 096
    Billets dans le blog
    6

    Par défaut

    bonsoir,

    Personnellement j opterai pour la serialisation.

    ++

  3. #3
    Nouveau Candidat au Club Avatar de Exulan
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : juillet 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Merci de votre réponse.
    Je me suis renseigné sur la classe XmlSerializer mais je n'ai pas trouvé comment faire pour résoudre mon problème.

  4. #4
    Membre expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    octobre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 504
    Points : 3 096
    Points
    3 096
    Billets dans le blog
    6

    Par défaut

    Premièrement :

    Tu créés une classe serializable comme suit :

    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
     
        <Serializable>
        Public Class Root
     
    #Region " Fields "
            <XmlIgnore()>
            Private m_Facture As List(Of FactureInfos)
    #End Region
     
    #Region " Properties "
            Public Property Facture() As List(Of FactureInfos)
                Get
                    Return m_Facture
                End Get
                Set(value As List(Of FactureInfos))
                    m_Facture = value
                End Set
            End Property
    #End Region
     
    #Region " Constructor "
            Sub New()
                m_Facture = New List(Of FactureInfos)
            End Sub
    #End Region
     
    #Region " Methods "
            ''' <summary>
            ''' Charge l'état courant du fichier XML.
            ''' </summary>
            ''' <returns>Valeur de type Root</returns>
            Public Shared Function LoadFile(FilePath As String) As Root
                Dim deserializer As New XmlSerializer(GetType(Root))
                Dim read As New StreamReader(FilePath)
                Dim p As Root = DirectCast(deserializer.Deserialize(read), Root)
                read.Close()
                Return p
            End Function
     
    #End Region
     
        End Class
    Une autre classe serializable :

    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
     
        <Serializable>
        Public Class FactureInfos
     
    #Region " Properties "
            Public Property Site As String
            Public Property codeDestinataire As String
            Public Property codeServiceExecutant As String
            Public Property idFournisseur As String
            Public Property codeCadreFacturation As String
            Public Property numeroFactureSaisi As String
         ' Et bien d'autres propriétés avec les types que tu veux.......etc.........
    #End Region
     
    #Region " Constructor "
            Sub New()
            End Sub
    #End Region
     
        End Class
    C'est déjà une bonne base de travail donc essayes de te creuser un peu la tête et de comprendre les ressources qui explique la Serialization !!!!

    A+

  5. #5
    Nouveau Candidat au Club Avatar de Exulan
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : juillet 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Je vous remercie de votre implication, j'ai commencé à travailler avec la base que vous m'avez donnée.
    J'avais aussi pensé à modifier directement le fichier csv avant la conversion, qu'en pensez-vous?


    Et bon week end.

Discussions similaires

  1. conversion .csv to .xml
    Par guillaumeC65 dans le forum Langage
    Réponses: 4
    Dernier message: 28/06/2012, 10h50
  2. Réponses: 2
    Dernier message: 27/05/2012, 10h50
  3. Parser flux XML sur plusieurs niveaux
    Par Freedolphin dans le forum Syntaxe
    Réponses: 2
    Dernier message: 30/01/2012, 18h42
  4. Réponses: 5
    Dernier message: 04/07/2011, 20h55
  5. Réponses: 3
    Dernier message: 20/08/2008, 10h24

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