es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando ChoETL para imprimir un archivo CSV devuelve valores a la consola como “dinámicos”.

Hola, soy totalmente nuevo en C# y tengo que entregar un módulo para pruebas de integración mañana. Estaba buscando una forma fácil y rápida de leer archivos CSV y encontré ChoETL: https://www.codeproject.com/Articles/1145337/Cinchoo-ETL-CSV-Reader?msg=5847644#xx5847644xx

Siguiendo su primer ejemplo, intenté ejecutar el código:

using ChoETL;
using System;

foreach (dynamic rec in new ChoCSVReader("Emp.csv")
    .WithFirstLineHeader())
{            
    Console.WriteLine($"Id: {rec.Id}");
    Console.WriteLine($"Name: {rec.Name}");
}

Cuando lo ejecuto, obtengo la siguiente salida:

Id: 1
Name: dynamic
Id: 2
Name: dynamic
Id: 3
Name: dynamic

En lugar de:

Id: 1
Name: Tom
Id: 2
Name: Carl
Id: 3
Name: Mark

¿Por qué sucede esto? ¿Y a qué se está convirtiendo ‘rec’ en tiempo de ejecución? No sé nada sobre tipos dinámicos.

Ejecuté esto en un proyecto de Consola en NetCore 5.0 en VS2019.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¡Hola!

    Parece que el problema es causado por el uso de tipado dinámico en el código. En el ejemplo, el ChoCSVReader devuelve registros de tipo dinámico, lo que significa que el tipo del registro se determina en tiempo de ejecución, en función de la estructura del archivo CSV.

    Cuando intentas acceder a las propiedades del registro dinámico usando rec.Id y rec.Name, el compilador no tiene información sobre el tipo de estas propiedades, por lo que asume que también son de tipo dinámico. Esto da como resultado la salida que estás viendo, donde los nombres de las propiedades son correctos, pero los valores se tratan como tipos dinámicos.

    Una forma de resolver este problema es usar un objeto fuertemente tipado en lugar del tipo dinámico. Puedes definir una clase para representar la estructura del archivo CSV y utilizar esa clase en el ChoCSVReader. Por ejemplo:

    public class Empleado
    {
        public int Id { get; set; }
        public string Nombre { get; set; }
    }
    
    // ...
    
    foreach (Empleado rec in new ChoCSVReader<empleado>("Emp.csv")
        .WithFirstLineHeader())
    {            
        Console.WriteLine($"Id: {rec.Id}");
        Console.WriteLine($"Nombre: {rec.Nombre}");
    }
    

    Esto debería darte la salida que esperas.

    ¡Espero que esto te ayude!

Comments are closed.