12
votes

Convertir le fichier CSV en XML

J'ai besoin de convertir un CSV en un document XML. Les exemples que j'ai vus jusqu'à présent, tous montrent comment procéder avec un nombre fixe de colonnes dans le CSV.

Je l'ai jusqu'à présent, à l'aide de LINQ: P>

String[] File = File.ReadAllLines(@"C:\text.csv");

        String xml = "";

        XElement top = new XElement("TopElement",

        from items in File

        let fields = items.Split(';')

        select new XElement("Item",

        new XElement("Column1", fields[0]),

        new XElement("Column2", fields[1]),

        new XElement("Column3", fields[2]),

        new XElement("Column4", fields[3]),

        new XElement("Column5", fields[4])

        )

        );

        File.WriteAllText(@"C:\xmlout.xml", xml + top.ToString());


0 commentaires

5 Réponses :


32
votes
<TopElement>
  <Item>
    <Column0>A</Column0>
    <Column1>B</Column1>
    <Column2>C</Column2>
  </Item>
  <Item>
    <Column0>D</Column0>
    <Column1>E</Column1>
    <Column2>F</Column2>
  </Item>
  <Item>
    <Column0>G</Column0>
    <Column1>H</Column1>
  </Item>
</TopElement>

8 commentaires

Assez proche. Mais j'ai besoin de scinder le mot de l'émission sur chaque ligne séparée par A; Donc, la sortie XML ressemblerait à ceci comme ceci: <élément> Word Word <élément> mot < élément> mot mot Word Word Je l'ai presque eu avec le code que j'ai posté, mais je obtenu uniquement le premier mot dans chaque ligne. J'ai donc besoin d'ajouter une sorte de boucle, qui ajoute un élément de colonne pour chaque mot sur chaque ligne séparée par A;


@SOeren: N'est-ce pas ce que ma solution fait? J'ai ajouté un exemple de clarification.


Cela fonctionne bien. La partie ligne.split (';') n'était pas dans le premier exemple et j'ai essayé de l'ajouter moi-même. Je ne savais tout simplement pas comment l'ajouter. J'ai besoin d'étudier cette linq de plus. Merci de votre aide.


Super post ... Bits et morceaux d'occasion pour la mienne et ça a fonctionné parfaitement


Cela m'a sauvé beaucoup de temps. Merci pour cette grande solution!


Répondant un peu tard, mais si vos colonnes peuvent contenir le délimiteur dans une colonne citée, sachez que la chaîne .Split () ne fait pas attention aux cordes citées. Exemple: var x = "\" cité; string \ ""; var mots = x.split (';'); mots [0]; // "mots cités [1]; //" String "Donc, si votre délimiteur est un caractère courant, vous aurez des colonnes supplémentaires de données.


@DTB si j'ai besoin "a; b" comme élément unique


Salut @dtb, bonne solution. Mais je me demandais comment ajoutons-nous les colonnes comme éléments d'étiquette d'auto-fermeture afin qu'ils soient au lieu de d . J'apprécierai vraiment votre aide. J'ai essayé de regarder autour de vous et cela semble être la meilleure solution, mais il faut comprendre comment la faire de soi-même.



11
votes

Si vous souhaitez utiliser les en-têtes comme noms d'éléments: xxx


1 commentaires

Y a-t-il de toute façon pour convertir cet exemple en Json?



4
votes

J'ai écrit une classe qui dérive de l'extrait de Vlax. De plus, j'ai fourni un test d'unité pour documenter le flux de travail.

Test de l'unité: xxx

CSV à XML: xxx

Remarque:

J'ai prolongé la solution de Vlax en supprimant une virgule de fuite pour chacune des entrées de la ligne CSV qui a provoqué une exception d'exécution basée sur un indice étant hors limites par rapport à l'en-tête de colonne.


2 commentaires

Excellente mise en œuvre!


Le code fonctionne bien, mais cela ne fonctionne pas au cas où j'ai une valeur séparée de virgule dans mon CSV.



1
votes

Cinchoo ETL - une bibliothèque open source disponible pour faire la conversion de CSV en XML Facilement avec peu de lignes de code

pour un échantillon CSV: xxx

sortie xml: xxx

Code de paiement Pour une aide supplémentaire.

Disclaimer: Je suis l'auteur de cette bibliothèque.


0 commentaires

0
votes

Voici une solution sans utiliser de linq imbriqué, plus simple à comprendre.

  • utilise LINQ vers XML.
  • prend en charge différents délimitères (const)
  • Support Chaque ligne a des tranches différentes

    Le contenu de INPUT.CSV : xxx

    Le code pour le processus:

    Programme.cs xxx

    Après avoir exécuté le code, le résultat est ci-dessous: xxx

    La solution complète Visual Studio pour ce code peut être vue ici: https://github.com/yanglr/dotnetinterview/tree/master/csvtoxmlled/a >.


0 commentaires