2010-01-21 15 views
6

FileHelpers supporta una funzionalità denominata "Record RunTime" che consente di leggere un file CSV in un DataTable quando non si conosce il layout fino al runtime.Creare dinamicamente un file CSV con FileHelpers

È possibile utilizzare FileHelpers per creare un file CSV in fase di esecuzione nello stesso modo?

In base a qualche input utente, il file CSV che deve essere creato avrà campi diversi che possono essere conosciuti solo in fase di esecuzione. Posso creare il tipo necessario per il motore FileHelper come descritto nella loro sezione di lettura, ma non riesco a capire in che formato devono essere scritti i miei dati.

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

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

EDIT

In alternativa, qualcuno può suggerire una buona biblioteca CSV che può creare un file CSV senza conoscere i suoi campi fino al runtime? Ad esempio, creare un file CSV da un DataTable.

risposta

6

In effetti, la libreria permette solo ora di leggere i record di runtime, ma per la scrittura purpouses è possibile utilizzare il metodo DataTableToCsv in questo modo:

CsvEngine.DataTableToCsv(dt, filename); 

lasciarlo conosciuto se questo aiuta.

+0

Fantastico :) Questa è un'ottima soluzione, ma esiste un modo per scrivere in uno stream? Questo non è un rompicapo, ma salverebbe alcuni passaggi. Ad ogni modo, grazie! –

+0

Non al momento ma inviami un'email stiamo lavorando attivamente alla prossima versione della libreria e sarebbe molto facile aggiungere una versione sovraccaricata del metodo per scrivere flussi :) – MarcosMeli

+0

@Marcos: è la prossima versione che verrà supportata le liste generiche ('Elenco ') come tipo restituito (anziché solo array) dal FileEngine? :-) –

1

So che questa è una domanda vecchia, ma mi sono imbattuto nello stesso problema e ho trascorso un po 'di tempo a cercare una soluzione, quindi ho deciso di condividere le mie scoperte.

Se si utilizza FileHelpers RunTime Records per creare la definizione, è possibile popolare la stessa definizione mediante la riflessione.

Per esempio, se si crea una definizione

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

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

Ora è possibile usare lo stesso tipo creato da FileHelpers per popolare i valori come segue:

 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"); 
     } 

E poi scrivere in un file o una stringa:

Problemi correlati