En-têtes de colonnes dans CSV utilisant la bibliothèque fileHelpers?

Existe-t-il un atsortingbut de champ intégré dans la bibliothèque FileHelper qui appenda une ligne d’en-tête dans le fichier CSV généré final?

J’ai googlé et n’ai pas trouvé beaucoup d’informations à ce sujet. Actuellement j’ai ceci:

DelimitedFileEngine _engine = new DelimitedFileEngine(T); _engine.WriteStream (HttpContext.Current.Response.Output, dataSource, int.MaxValue); 

Cela fonctionne, mais sans en-tête.

Je pense avoir un atsortingbut comme FieldTitleAtsortingbute et l’utiliser comme en-tête de colonne.

Donc, ma question est à quel point dois-je vérifier l’atsortingbut et insérer des colonnes d’en-tête? Quelqu’un at-il déjà fait quelque chose de similaire auparavant?

Je voudrais insérer les en-têtes et utiliser un texte personnalisé différent du nom du champ en ayant un atsortingbut sur chaque membre de l’object:

 [FieldTitleAtsortingbute("Custom Title")] private ssortingng Name 

et peut-être une option pour demander au moteur d’insérer l’en-tête lorsqu’il est généré.

Ainsi, lorsque WriteStream ou WriteSsortingng est appelé, la ligne d’en-tête sera insérée avec des titres personnalisés.

J’ai trouvé quelques événements pour DelimitedFileEngine, mais pas le meilleur moyen de détecter si l’enregistrement actuel est la première ligne et comment insérer une ligne avant cela.

Voici un code qui le fera: https://gist.github.com/1391429

Pour l’utiliser, vous devez décorer vos champs avec [FieldOrder] (une bonne pratique FileHelpers quand même). Usage:

 [DelimitedRecord(","), IgnoreFirst(1)] public class Person { // Must specify FieldOrder too [FieldOrder(1), FieldTitle("Name")] ssortingng name; [FieldOrder(2), FieldTitle("Age")] int age; } ... var engine = new FileHelperEngine { HeaderText = typeof(Person).GetCsvHeader() }; ... engine.WriteFile(@"C:\people.csv", people); 

Mais le support pour cela doit vraiment être ajouté dans FileHelpers lui-même. Je peux penser à quelques questions de conception auxquelles je devrais répondre avant de pouvoir les mettre en œuvre:

  • Que se passe-t-il lors de la lecture d’un fichier? Afaik FileHelpers est actuellement basé sur la position de colonne ordinale et ignore les noms de colonne … mais si nous avons maintenant des atsortingbuts [FieldHeader] partout, devrions-nous également essayer de faire correspondre les propriétés avec les noms de colonne dans le fichier? Devriez-vous lancer une exception s’ils ne correspondent pas? Que se passe-t-il si la position ordinale ne correspond pas au nom de la colonne?
  • Lors de la lecture en tant que tableau de données, devriez-vous utiliser A) le nom du champ (conception actuelle) ou B) le nom de la colonne du fichier source ou C) l’atsortingbut FieldTitle?

Je sais que c’est une vieille question, mais voici une réponse qui fonctionne pour v2.9.9

 FileHelperEngine engine = new FileHelperEngine(); engine.HeaderText = engine.GetFileHeader(); 

Je ne sais pas si vous en avez toujours besoin, mais voici comment FileHelper fonctionne: Pour inclure des en-têtes de colonnes, vous devez définir une chaîne avec des en-têtes séparés de la même manière que votre fichier. Par exemple avec ‘|’ comme délimiteur:

  public const ssortingng HeaderLine = @"COLUMN1|COLUMN2|COLUMN3|..."; 

Ensuite, lorsque vous appelez votre moteur:

 DelimitedFileEngine _engine = new DelimitedFileEngine { HeaderText = HeaderLine }; 

Si vous ne voulez pas écrire les en-têtes, ne définissez pas l’atsortingbut HeaderText sur le moteur.

 List myList = new List(); FileHelperEngine engine = new FileHelperEngine(typeof(MyClass)); Ssortingng[] fieldNames = Array.ConvertAll(typeof(MyClass).GetFields(), delegate(FieldInfo fo) { return fo.Name; }); engine.HeaderText = Ssortingng.Join(";", fieldNames); engine.WriteFile(MapPath("MyClass.csv"), myList); 

J’ai trouvé que vous pouvez utiliser FileHelperAsyncEngine pour accomplir cela. En supposant que vos données sont une liste appelée “output” de type “outputData”, vous pouvez alors écrire du code qui ressemble à ceci:

  FileHelperAsyncEngine outEngine = new FileHelperAsyncEngine(typeof(outputData)); outEngine.HeaderText = "Header1, Header2, Header3"; outEngine.BeginWriteFile(outputfile); foreach (outputData line in output){ outEngine.WriteNext(line); } outEngine.Close();