web-dev-qa-db-fra.com

Comment créer la classe de mappage C # vers csvhelper

J'ai un fichier csv avec 40 colonnes et je veux le charger dans une table de données en utilisant csvhelper. Après avoir installé la bibliothèque, j'ai fait ceci:

using (TextReader reader = File.OpenText(fileName)) {
   var csv = new CsvReader(reader);
   while (csv.Read()) {
       var farmID = csv.GetField(0);
       Console.WriteLine(farmID);
   }
}

et comme vous le voyez, j'ai une déclaration de console et cela fonctionne parfaitement.

Cependant, le csvReader a un constructeur qui prend une classe personnalisée pour lui charger directement les données.

J'ai essayé ceci:

var record = csv.GetRecord<CSVFileDefinition>();

mais j'ai cette exception

No properties are mapped for type 'MyProjectName.CSVFileDefinition'.

parce que CSVFileDefinitionest une classe vide.

ma question est de savoir comment remplir cette classe.

Voici la bibliothèque:

http://joshclose.github.io/CsvHelper/

Merci beaucoup

Update 2

La solution qui fonctionne pour moi est:

sealed class CSVFileDefinitionMap : CsvClassMap<CSVFileDefinition>
{
   public CSVFileDefinitionMap()
   {
      Map(m => m.FRM_ID).Name("FARM ID");
      Map(m => m.FRM_OWNER).Name("FARM OWNER ");
   }
}

class CSVFileDefinition
{
    public string FRM_ID { get; set; }
    public string FRM_OWNER { get; set; }
}

using (TextReader reader = File.OpenText(fileName)) {
    var csv = new CsvReader(reader);
    csv.Configuration.RegisterClassMap<CSVFileDefinitionMap>();
    while (csv.Read()) {
       var record = csv.GetRecord<CSVFileDefinition>();
    }
}
21
Agnieszka Polec

Il semble que tout ce que vous devez faire est d'ajouter une propriété à la classe CSVFileDefinition pour chaque nom de colonne que vous vous attendez à trouver dans le fichier CSV, et le mappage automatique devrait prendre soin du reste.

Par exemple, cela doit extraire la colonne ID de la batterie à condition que le nom de la propriété corresponde au nom de la colonne dans le CSV:

public class CSVFileDefinition
{
    public int FarmId { get; set; }

    //... add other columns here...
}
5
Mitchell Lane