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
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>();
}
}
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...
}