2010-01-21 26 views
6

FileHelpers admite una característica llamada "RunTime Records" que le permite leer un archivo CSV en una DataTable cuando no conoce el diseño hasta el tiempo de ejecución.Cree dinámicamente un archivo CSV con FileHelpers

¿Es posible utilizar FileHelpers para crear un archivo CSV en tiempo de ejecución de la misma manera?

En función de la entrada de algunos usuarios, el archivo CSV que se debe crear tendrá diferentes campos que solo pueden conocerse en tiempo de ejecución. Puedo crear el Tipo necesario para el motor FileHelper como se describe en su sección de lectura, pero no puedo determinar en qué formato deben estar escritos mis datos.

var engine = new FileHelpers.FileHelperEngine(GenerateCsvType()); 

engine.WriteStream(context.Response.Output, dontKnow); 

EDITAR

Alternativamente, puede alguien sugerir una buena biblioteca CSV que puede crear un archivo CSV sin conocer sus campos hasta el tiempo de ejecución? Por ejemplo, cree un archivo CSV desde una DataTable.

Respuesta

6

De hecho, la biblioteca sólo permite ahora a leer los registros de tiempo de ejecución pero para purpouses escritura se puede utilizar el método DataTableToCsv así:

CsvEngine.DataTableToCsv(dt, filename); 

dejarme conocido si eso ayuda.

+0

Fantástico :) Esta es una gran solución, pero ¿hay alguna manera de escribir en una secuencia en su lugar? Eso no es un factor decisivo, pero salvaría algunos pasos. De cualquier manera, ¡gracias! –

+0

Por el momento, pero no me envíe un correo electrónico, estamos trabajando activamente en la próxima versión de la biblioteca y sería muy fácil agregar una versión sobrecargada del método para escribir transmisiones :) – MarcosMeli

+0

@Marcos: es la próxima versión que va a admitir las listas genéricas ('List ') como tipo de retorno (en lugar de solo matrices) de FileEngine? :-) –

1

Sé que esta es una pregunta anterior, pero me encontré con el mismo problema y pasé un tiempo buscando soluciones, así que decidí compartir mis hallazgos.

Si está utilizando FileHelpers RunTime Records para crear su definición, puede poblar la misma definición mediante la reflexión.

Por ejemplo, si crea una definición

 DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ","); 
     cb.AddField("StringField", "string"); 

     Type t = cb.CreateRecordClass(); 
     FileHelperEngine engine = new FileHelperEngine(t); 

Ahora puede utilizar mismo tipo creado por FileHelpers para rellenar los valores de la siguiente manera:

 object customClass = Activator.CreateInstance(t); 
     System.Reflection.FieldInfo field = customClass.GetType().GetField("StringField", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); 
     if (field != null) 
     { 
      field.SetValue(customClass, "StringValue"); 
     } 

Y luego escribirlo en un archivo o cadena:

Cuestiones relacionadas