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

C# Discussion :

fusionner des lignes fichier .txt [Débutant]


Sujet :

C#

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut fusionner des lignes fichier .txt
    Bonjour,

    Je viens solliciter votre aide car je manque de méthodologie pour un problème que je rencontre.

    Je dois effectuer une fusion de ligne identique dans un fichier d'entrée .xml

    Le fichier XML ne porte que l'extension (car dedans c'est plus un fichier csv en réalité avec des ; pour délimiter chaque paramètre). Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PLNE-CPT;OUVDEF;20111103;LC003-2;LC003;09;TOULOUSE;RTLS;TOULOUSE;;;;;;;;;;;;;;;;;;;;;;;;;;
    PLNE-CPT;OUVDEF;20111103;LC003-2;;09;TOULOUSE;RTLS;TOULOUSE;Oui;;;;;;;;;;;;;;;;;;;;;;;;;
    PLNE-CPT;OUVDEF;20111103;LC003-2;;09;TOULOUSE;RTLS;TOULOUSE;;;PTZ;;;;;;;;;;;;;;;;;;;;;;;
    PLNE-CPT;OUVDEF;20111103;LC003-2;;09;TOULOUSE;RTLS;TOULOUSE;;Relevé jour. données horaires;;;;;;;;;;;;;;;;;;;;;;;;
    Comme je travaille avec biztalk, je ne peux pas changer l'extension.

    En fait, j'aurais besoin de fusionner certaines lignes. Pour cela je dois comparer deux champs de chaque lignes pour regarder ceux qui sont identiques, et ainsi fusionner ces deux champs.

    Exemple (fichier avant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PLNE-CPT;OUVDEF;20111103;LC003-2;;09;TOULOUSE;RTLS;TOULOUSE;Oui;;;;;;;;;;;;;;;;;;;;;;;;;
    PLNE-CPT;OUVDEF;20111103;LC003-2;;09;TOULOUSE;RTLS;TOULOUSE;;;PTZ;;;;;;;;;;;;;;;;;;;;;;;
    Après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLNE-CPT;OUVDEF;20111103;LC003-2;;09;TOULOUSE;RTLS;TOULOUSE;Oui;;PTZ;;;;;;;;;;;;;;;;;;;;;;;
    En fusionnant, chaque paramètre doit garder sa place respective. Pour fusionner, je dois utiliser le 2eme et 3eme paramètre de chaque ligne.

    J'ai essayé de chercher, en travaillant avec un dataset, puis requête linq, mais je doute à un résultat fiable et rapide. Puis en lisant ligne par ligne .. mais je finis avec des boucles de partout, et j'ai peur que ca soit pas fiable du tout..

    Auriez-vous une méthode pour m'aiguiller pour trouver une solution ?

    Merci d'avance !

  2. #2
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Nécessité de sérialiser ?

    Quel champ te permet d'établir l'égalité ?
    Est-il possible que dans certains cas il y ait conflit ? (par exemple, pour une même valeur tu as "Toto", "Tata", que prends-tu ?

    Avec quelque chose du genre, tu peux avoir le résultat escompté :

    Code c# : 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
     
    public void DoSomething(String message)
            {
                Dictionary<String, String> dictionary = new Dictionary<string, string>();
                string line;
                char[] separator = { ';' };
                int keyPosition = 3;
                string key = null;
     
                using (StringReader stringReader = new StringReader(message))
                {
                    // Creation du dictionnaire
                    while ((line = stringReader.ReadLine()) != null)
                    {
                        try
                        {
                            key = line.Split(separator).GetValue(keyPosition).ToString();
                            dictionary.Add(key, line);
                        }
                        catch (ArgumentException)
                        {
                            // La clé existe déjà : le cas que tu veux !
     
                            // Récupération de l'ancienne valeur
                            KeyValuePair<String,String> val = dictionary.Single(k => k.Key == key);
     
                            // Merge
                            String newVal = MergeLines(val.Value, line);
     
                            // Remplacement de la valeur
                            dictionary.Remove(key);
                            dictionary.Add(key, newVal);
                        }
                        catch (Exception) { throw; }
                    }                
                }
            }
     
            private string MergeLines(string p, string line)
            {
                throw new NotImplementedException();
            }

    C'est pas optimal, faudrait peut-être utiliser une liste de paire clé/valeur plutôt qu'un dictionnaire pour simplifier l'update.., mais c'est un début pour te donner une piste.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Il manque une info cruciale : selon quel critère décides-tu que 2 lignes doivent être fusionnées ? Y a-t-il un champ qui sert d'identifiant (ou éventuellement plusieurs champs) ?

    En supposant que c'est les 4 premiers champs qui servent d'identifiants (ça semble être le cas dans ton exemple), on va regrouper par exemple tous les enregistrements qui ont par exemple "PLNE-CPT;OUVDEF;20111103;LC003-2" dans ces champs.

    Ensuite, pour chaque groupe d'enregistrements, il faudrait savoir comment tu gères les conflits, comme mentionné par Er3van. Je vais supposer qu'on gère ça de la façon la plus simple possible : pour un champ donné, on prend la première valeur non vide

    Avec Linq, on peut facilement grouper les lignes par identifiant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        string path = @"E:\tmp\data.csv";
        string[] lines = File.ReadAllLines(path);
     
        var groups =
            from line in lines
            let values = line.Split(';')
            group values by new
            {
                Key1 = values[0],
                Key2 = values[1],
                Key3 = values[2],
                Key4 = values[3],
            };
    (je te laisse le soin de trouver des noms plus pertinents que Key1, Key2 etc, mais moi je sais pas à quoi correspondent les valeurs ; de toutes façons ça n'a pas d'importance puisqu'on ne réutilise pas ces valeurs par la suite)

    On se retrouve donc avec une liste de groupes d'enregistrements, chaque enregistrement étant sous la forme d'un tableau de string. Ensuite il faut voir comment fusionner les enregistrements d'un même groupe. Pour ça, le plus simple est d'écrire une méthode dédiée, où on crée un tableau de la bonne taille qu'on remplit en parcourant les enregistrements. Si une valeur est déjà renseignée, on la laisse, sinon on prend celle de l'enregistrement en cours.

    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
    string[] MergeRecords(IEnumerable<string[]> records)
    {
        string[] firstRecord = records.First();
        string[] finalRecord = new string[firstRecord.Length];
        foreach (var record in records)
        {
            for (int i = 0; i < finalRecord.Length; i++)
            {
                if (string.IsNullOrEmpty(finalRecord[i]) &&
                    !string.IsNullOrEmpty(record[i]))
                {
                    finalRecord[i] = record[i];
                }
            }
        }
        return finalRecord;
    }
    On peut maintenant générer un seul enregistrement pour chaque groupe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        var mergedRecords =
            from g in groups
            select MergeRecords(g);
    On peut même simplifier un peu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var mergedRecords = groups.Select(MergeRecords);
    On obtient une liste d'enregistrements, qui sont toujours sous forme de tableaux de strings ; il ne reste plus qu'à regénérer les lignes en séparant les valeurs par des ";", à l'aide de String.Join, et à les écrire dans le nouveau fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using (var writer = new StreamWriter(outputPath))
    {
        foreach (var rec in mergedRecords)
        {
            writer.WriteLine (String.Join(";", rec));
        }
    }
    Résultat pour les 4 lignes de ton exemple :

    PLNE-CPT;OUVDEF;20111103;LC003-2;LC003;09;TOULOUSE;RTLS;TOULOUSE;Oui;Relevé jour. données horaires;PTZ;;;;;;;;;;;;;;;;;;;;;;;

  4. #4
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Pour compléter :

    - Je suis parti de l'hypothèse arbitraire que c'est le 3e champ qui permettait d'établir l'égalité dans mon exemple, s'il faut aditionner plusieurs contraintes, l'utilisation du dictionnaire ne marcherait pas tel quel, il faudrait utiliser une clé qui concatène les contraintes.

    - Si le cas où les valeurs "à fusionner" est courant (> 10% des cas), la méthode de TomLev sera plus adaptée et plus performante.

    - Si cela représente qu'un pourcentage faible, je trouve ça plus simple de gérer ça comme une exception, mais c'est qu'une question de préférence.


    Question bonus : Que fais-tu de ces données après traitement ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Er3van Voir le message
    - Si cela représente qu'un pourcentage faible, je trouve ça plus simple de gérer ça comme une exception, mais c'est qu'une question de préférence.
    Comme un cas exceptionnel si tu veux, mais pas comme une exception... c'est une mauvaise pratique d'intercepter une exception quand tu peux facilement éviter qu'elle se produise. En l'occurrence il suffit de vérifier si la clé est déjà dans le dictionnaire...

  6. #6
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    C'est la différence entre la langue française :
    - Exception : cas qui arrive rarement

    ...et le C# :
    - Exception : cas qui ne devrait pas arriver

    Mais sur le principe je suis d'accord avec toi ! Mais bon, mettre un if c'est pas le plus compliqué.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Merci beaucoup pour la réponse !

    Je vais tester tout ca ce matin.

    Au niveau des champs de comparaison, il y a 3 champs, mais pas forcément les 3 premiers (bien que le premier champs est souvent identique, il n'est pas à comparer, mais je vais adapter le code linq pour récupérer les champs qu'il me faut.

    Ensuite une fois que j'ai ces données, je les transmets directement dans un fichier texte, comme le fichier que je récupère en entrée.

    edit : Sinon il n'y aura pas de conflits, du fait que pour plusieurs champs à fusionner, les champs clés seront identiques (première valeur à prendre par exemple), alors que les autres champs, les valeurs ne seront pas dans les mêmes cases (si vous voyez ce que je veux dire ?).

    edit 2 : Par contre j'ai une question bête ... en fait j'ai un fichier xml en entrée (pas celui mis dans le premier message mais un vrai xml). Du coup y a t'il un moyen simple de mettre dans un tableau toutes les valeurs d'un xml ? Par contre le xml est de la sorte suivant : un header (une ligne), un corps (plusieurs lignes) et un footer (une ligne), du coup le header et le footer ont le même nombre de champs (mais pas les mêmes noms de colonnes) mais les champs corps, ont beaucoup plus de champs. J'essaie de trouver une fonction qui convertir xml=>csv mais sait-on jamais si vous répondez avant

    Encore merci pour la réponse, étant débutant, je vais regarder un peu vos solutions pour comprendre et les employer, je tiens au courant dès que cela est fait.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par bob633 Voir le message
    edit 2 : Par contre j'ai une question bête ... en fait j'ai un fichier xml en entrée (pas celui mis dans le premier message mais un vrai xml). Du coup y a t'il un moyen simple de mettre dans un tableau toutes les valeurs d'un xml ? Par contre le xml est de la sorte suivant : un header (une ligne), un corps (plusieurs lignes) et un footer (une ligne), du coup le header et le footer ont le même nombre de champs (mais pas les mêmes noms de colonnes) mais les champs corps, ont beaucoup plus de champs. J'essaie de trouver une fonction qui convertir xml=>csv mais sait-on jamais si vous répondez avant
    La notion de "ligne" n'a pas de sens en XML, c'est juste de la mise en forme... montre plutôt la structure de ton document XML et ce que tu veux obtenir en sortie

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    En tout cas j'ai compris le principe de votre explication, ca me plait, par contre je ne sais pas comment l'adapter a du XML en entrée. En fait comme je travaille sur Biztalk, il ne sait gérer que du XML. En gros en entrée de fonction, j'ai un msg de type XmlDocument.

    Voici la structure xml d'entrée :
    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
    <?xml version="1.0" encoding="utf-8" ?> 
    - <ns0:Outbound xmlns:ns0="http://Gal_Debatch.Schemas.Outbound_Gal">
    - <Header_outbound>
      <Header_outbound_Child1>000</Header_outbound_Child1> 
      <Header_outbound_Child2>FEMAEQ</Header_outbound_Child2> 
      <Header_outbound_Child3>MAXIMO</Header_outbound_Child3> 
      <Header_outbound_Child4>20111104</Header_outbound_Child4> 
      <Header_outbound_Child5>142342</Header_outbound_Child5> 
      <Header_outbound_Child6>COMPTAGAZ</Header_outbound_Child6> 
      <Header_outbound_Child7>0000000001</Header_outbound_Child7> 
      <Header_outbound_Child8>0</Header_outbound_Child8> 
      </Header_outbound>
    - <Corps_outbound>
      <Type_analyseur>PLNE-CPT</Type_analyseur> 
      <Evt>OUVDEF</Evt> 
      <DateEffet>20111103114352</DateEffet> 
      <CodePtMesur>LC003-2</CodePtMesur> 
      <CodeSect>09</CodeSect> 
      <NomSect>TOULOUSE</NomSect> 
      <CodeRegion>RTLS</CodeRegion> 
      <NomRegion>TOULOUSE</NomRegion> 
      </Corps_outbound>
    <Footer_outbound>
      <Footer_outbound_Child1>999</Footer_outbound_Child1> 
      <Footer_outbound_Child2>FEMAEQ</Footer_outbound_Child2> 
      <Footer_outbound_Child3>MAXIMO</Footer_outbound_Child3> 
      <Footer_outbound_Child4>20111104</Footer_outbound_Child4> 
      <Footer_outbound_Child5>142342</Footer_outbound_Child5> 
      <Footer_outbound_Child6>COMPTAGAZ</Footer_outbound_Child6> 
      <Footer_outbound_Child7>0000000001</Footer_outbound_Child7> 
      <Footer_outbound_Child8>62</Footer_outbound_Child8> 
      </Footer_outbound>
      </ns0:Outbound>
    La partie corps_outbound revient n fois dans ce document.

    Merci encore pour le temps passé .. car je patauge complet :/

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    OK mais tu veux quoi comme résultat ?
    Et pourquoi tu veux le convertir en CSV, tu peux pas plutôt traiter directement le XML ?

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Il faudrait retourner un fichier XML de même type que l'entrée, mais avec les champs fusionnés ...

    Sur la structure XML que j'ai donné, on voit moins de champs apparaitre que sur le fichier csv donné dans le message principale, c'est juste Biztalk qui ne les affiches pas lorsqu'il créé le fichier XML ... mais ils existent ! En gros toutes les structures de Corps_outbound ont 17 champs.

    Je pensais passer par du csv car je suis plus alaise avec du csv à traiter, mais en effet faut réensuite convertir en XML

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    On peut appliquer le même principe, bien que ce soit un peu plus complexe...

    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
        string path = @"E:\tmp\data.xml";
        var doc = XDocument.Load(path);
        var groupedRecords =
            from corps in doc.Root.Elements("Corps_outbound")
            let record = corps.Elements().ToDictionary(e => e.Name.LocalName, e => e.Value)
            group record by new
            {
                Type_analyseur = record["Type_analyseur"],
                Evt = record["Evt"],
                DateEffet = record["DateEffet"],
                CodePtMesur = record["CodePtMesur"],
            };
     
        var mergedRecords = groupedRecords.Select(MergeRecords).ToArray();
        var mergedElements =
            from record in mergedRecords
            select new XElement(
                "Corps_outbound",
                record.Select(kvp => new XElement(kvp.Key, kvp.Value)));
     
        var header = doc.Root.Element("Header_outbound");
        var footer = doc.Root.Element("Footer_outbound");
     
        doc = new XDocument(
            new XElement("Outbound",
                header,
                mergedElements,
                footer));
     
     
    ...
     
    static Dictionary<string, string> MergeRecords(IEnumerable<Dictionary<string, string>> records)
    {
        Dictionary<string, string> result = null;
        foreach (var record in records)
        {
            if (result == null)
            {
                result = record;
            }
            else
            {
                foreach (var key in record.Keys)
                {
                    if (!result.ContainsKey(key) || string.IsNullOrEmpty(result[key]))
                    {
                        result[key] = record[key];
                    }
                }
            }
        }
        return result;
     
    }
    (encore une fois, je te laisse voir les champs à utiliser dans le group by)

    Par contre attention, il n'y a aucune garantie que ça conserve l'ordre des éléments (vu que les clés d'un dictionnaire ne sont pas ordonnées)

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    D'accord, je vais faire cela.

    Par contre, en paramètre de ma fonction, j'ai un xmldocument, du coup j'ai du mal à l'utiliser, xDocument semble différent de XmlDocument ...

    Je pensais faire simplement un nouveau xmldocument qui récpuère le xml en paramètre de fonction, puis faire la fonction load dessus mais il veut pas ..

    J'ai l'impression de patauger sur des détails

    Ma classe se déclare comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public static XmlDocument FuncFusion(XmlDocument msg)
            {
    edit : En tout cas j'ai testé en mettant un chemin en dur pour le fichier XML ca semble fonctionner très bien, donc encore merci pour la solution !
    Ce n'est pas un problème si les enregistrements ne sont pas ordonnés, le logiciel saura gérer cela lorsqu'il va récupérer le fichier.
    Maintenant j'essaie de trouver pour ne pas mettre le fichier en dur, mais en le récupérant de la fonction .. car cette solution fonctionne que sur du xdocument ? ou aussi xmldocument ?

    Edit 2 : Bon j'avance .. j'arrive à récupérer mon xmldocument en entré et le parser en xdocument comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static XmlDocument FuncFusion(XmlDocument msg)
            {
                    XDocument doc =  XDocument.Parse(msg.OuterXml);
    }
    Par contre cette fonction ne semble pas fonctionner dans le sens inverse

    edit 3 : Finalement j'ai réussi à faire un xmldocument avec un xdocument ! Je test avec des fichiers réels voir le résultat et je passe en résolu !

    encore merci !!!!

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Effectivement XDocument et XmlDocument n'ont pas grand chose à voir, bien qu'ils représentent tous les 2 l'arbre DOM d'un document XML... Pour l'utilisation avec Linq to XML, tu es obligé d'avoir XDocument.

    Pour la conversion de XmlDocument vers XmlDocument, apparemment tu as déjà trouvé... mais elle n'est pas très propre. Il vaut mieux éviter de passer par une chaine de caractères si possible. Une autre solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XDocument doc;
    using (var reader = msg.CreateNavigator().ReadSubTree())
    {
        doc = XDocument.Load(reader);
    }
    Pour la conversion inverse, tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XmlDocument xmldoc = new XmlDocument();
    using (var reader = doc.CreateReader())
    {
        xmldoc.Load(reader);
    }

  15. #15
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Merci bien, je vais testé ca ! En tout cas ca donne le résultat que j'attendais, j'ai réussi à l'intégrer sans problème dans mon logiciel Biztalk !

    Encore merci pour le temps passé

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

Discussions similaires

  1. Extraire des lignes fichiers txt
    Par alkaz dans le forum C#
    Réponses: 4
    Dernier message: 27/05/2015, 12h01
  2. Réponses: 2
    Dernier message: 06/06/2008, 16h49
  3. [SQL-VBA]fusionner des lignes
    Par shagun dans le forum Requêtes et SQL.
    Réponses: 42
    Dernier message: 13/04/2007, 13h37
  4. [BATCH]Récup 2nd ligne fichier txt
    Par guigui11 dans le forum Windows
    Réponses: 2
    Dernier message: 28/09/2006, 17h34
  5. Effacer dernière ligne fichier txt
    Par soulryo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/09/2006, 22h05

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