2010-08-26 18 views
1

J'ai une tâche où je dois lire un fichier csv et écrire le contenu dans une liste C#. Puisque le fichier csv peut changer sa mise en page (légende/ordre) dans le futur, je veux utiliser un fichier de configuration pour mapper les attributs..net en utilisant xml pour mapper csv en classe

Maintenant, je me demande s'il y a un exemple là donc je ne dois pas réinventer la weel: D

Ma source de données ressemble à ça (tabulation séparé)

Customer No. Customer Name Created  Discount 
10215   John Doe   2010-08-25 5050.23 

Et mon classe comme ceci:

Class Customer 
{ 
    string CustomerNo {get;set;} 
    string CustomerName {get;set;} 
    DateTime CreatedOn {get;set;} 
    decimal Discount {get;set;} 
} 

maintenant, je veux avoir un fichier XML externe avec la définition que je puisse le modifier à l'exécution sans recompiler le code.

<customermapping mapstoclass="my.namespace.Customer"> 
    <attribute csvcaption="Customer No." mapstoproperty="CustomerNo" 
       typeof="System.String" required="true"> 
    <attribute csvcaption="Customer Name" mapstoproperty="CustomerName" 
       typeof="System.String" required="true"> 
    <attribute csvcaption="Created" mapstoproperty="CreatedOn" 
       typeof="System.DateTime" required="false"> 
    <attribute csvcaption="Discount" mapstoproperty="Discount" 
       typeof="System.Decimal" required="false"> 
</customermapping> 

A la fin de la journée, je veux faire ce qui suit: (je peux déjà lire toutes les valeurs du fichier csv (la première ligne est la légende et est dans un tableau séparé)

List<Customer> customers = 
    CreateCustomerList(string[] csvCaptions, string[] csvLines, 
         "c:\customermapping.xml"); 

ne devrait pas être trop compliqué, mais comme je l'ai dit, si quelqu'un a déjà fait quelque chose de similaire, les exemples sont les bienvenus.

+0

Bonjour, j'ai déjà eu une bonne solution de travail ... Je rencontre le même problème maintenant ... merci –

+0

@jalchr: Non, mais pour mes derniers projets j'ai utilisé CsvHelper (de nuget) qui est génial. Il devrait être possible de créer une configuration dans le code et de la sérialiser en xml. –

+0

effectivement je suis intéressé par l'inverse. J'ai besoin d'avoir une configuration définie en XML et appliquée aux fichiers entrants par rapport à un modèle de classe standard. Des pensées ? –

Répondre

0

On dirait que vous voulez réinventer le schéma XSD. Si vous pouvez modifier le format utiliser la xml et définissez les règles dans le fichier xml

Si vous ne pouvez pas modifier le format ou si vos données sont trop volumineuses pour s'intégrer au format xml, je suppose que vous êtes seul. CSV n'est pas plutôt un format ad hoc Je ne pense pas que n'importe quel corps se souciait assez de créer une validation de schéma pour cela.

+0

Je ne veux pas réinventer xsd. Je veux 'utiliser' xml pour définir les mappages entre mes données et mes classes. Comme nhibernate mappe les tables de base de données aux propriétés de classe. Comme je l'ai dit, ne devrait pas être trop compliqué à mettre en œuvre, mais peut-être qu'il existe une solution générique là-bas. –

+0

@SchlaWiener Je voulais dire que vous aimeriez créer quelque chose comme xsd pour csv. J'ai juste suggéré d'utiliser xml au lieu de csv et d'utiliser xsd pour définir votre mapping. Ensuite, vous pouvez utiliser xsd.exe pour mapper créer un mappage entre vos objets et les fichiers xml. –

0

Vous pourriez vouloir utiliser LINQ pour cela. Il y a un articles sur LINQ to texte ici:

Mise à jour: J'ai relu votre question et je ne suis plus sûr que l'utilisation LINQ sera vraiment aider à résoudre votre problème, mais je laisse la réponse ici juste au cas où cela aide.

Si vous pouvez tout à l'aide, je mettrais la logique sur ce que les colonnes mappent sur quelles propriétés dans le code plutôt que dans les fichiers XML.