example - Cómo crear la clase de mapeo C#a csvhelper
csvhelper c# example read (1)
Tengo un archivo csv con 40 columnas y quiero cargarlo en un datatable usando csvhelper. Después de instalar la biblioteca, hice esto:
using (TextReader reader = File.OpenText(fileName)) {
var csv = new CsvReader(reader);
while (csv.Read()) {
var farmID = csv.GetField(0);
Console.WriteLine(farmID);
}
}
y como ves, tengo una declaración de consola y funciona perfectamente.
Sin embargo, el csvReader tiene un constructor que toma una clase personalizada para cargar los datos directamente a él.
Intenté esto:
var record = csv.GetRecord<CSVFileDefinition>();
pero tengo esta excepción
No properties are mapped for type ''MyProjectName.CSVFileDefinition''.
porque el CSVFileDefinition es una clase vacía.
mi pregunta es como llenar esa clase
Esta es la biblioteca:
http://joshclose.github.io/CsvHelper/
Muchas gracias
Actualización 2
La solución que me funciona es:
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>();
}
}
Parece que todo lo que necesita hacer es agregar una propiedad a la clase CSVFileDefinition para cada nombre de columna que espera encontrar en el archivo CSV, y la asignación automática debe hacerse cargo del resto.
Por ejemplo, esto debería extraer la columna de ID de granja de servidores siempre que el nombre de la propiedad coincida con el nombre de la columna en el CSV:
public class CSVFileDefinition
{
public int FarmId { get; set; }
//... add other columns here...
}