2010-01-21 9 views
6

FileHelpers prend en charge une fonctionnalité appelée "RunTime Records" qui vous permet de lire un fichier CSV dans un DataTable lorsque vous ne connaissez pas la disposition avant l'exécution.Créer dynamiquement un fichier CSV avec FileHelpers

Est-il possible d'utiliser FileHelpers pour créer un fichier CSV à l'exécution de la même manière?

Selon certaines entrées utilisateur, le fichier CSV à créer aura des champs différents qui ne pourront être connus qu'au moment de l'exécution. Je peux créer le Type requis pour le moteur FileHelper comme décrit dans leur section de lecture, mais je ne peux pas comprendre dans quel format mes données doivent être écrites.

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

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

EDIT

Sinon, quelqu'un peut-il suggérer une bonne bibliothèque CSV qui peut créer un fichier CSV sans connaître ses champs jusqu'à l'exécution? Par exemple, créez un fichier CSV à partir d'un DataTable.

Répondre

6

En fait, la bibliothèque ne permet désormais de lire les enregistrements d'exécution mais pour purpouses d'écriture, vous pouvez utiliser la méthode DataTableToCsv comme ceci:

CsvEngine.DataTableToCsv(dt, filename); 

Permettez-moi connu si cela aide.

+0

Fantastique :) C'est une excellente solution, mais y a-t-il un moyen d'écrire dans un flux? Ce n'est pas une rupture d'accord, mais cela permettrait d'économiser quelques étapes. De toute façon, merci! –

+0

Pas pour le moment mais envoyez-moi un email nous travaillons activement dans la prochaine version de la bibliothèque et il serait très facile d'ajouter une version surchargée de la méthode pour écrire des flux :) – MarcosMeli

+0

@Marcos: est la prochaine version va supporter les listes génériques ('List ') comme type de retour (au lieu de seulement des tableaux) de FileEngine? :-) –

1

Je sais que c'est une vieille question, mais j'ai moi-même rencontré le même problème et j'ai passé du temps à chercher une solution, alors j'ai décidé de partager mes découvertes.

Si vous utilisez FileHelpers RunTime Records pour créer votre définition, vous pouvez remplir la même définition à l'aide de la réflexion.

Par exemple, si vous créez une définition

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

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

vous pouvez utiliser même type créé par FileHelpers pour remplir vos valeurs comme suit:

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

Et puis écrire un fichier ou chaîne:

Questions connexes