52 votes

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

Est-il intégré dans le champ de l'attribut dans la FileHelper bibliothèque qui va ajouter une ligne d'en-tête lors de la finale CSV généré?

J'ai Googlé et n'ai pas trouvé beaucoup d'info sur lui. Actuellement j'ai ceci:

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

Il fonctionne, mais sans en-tête.

Je pense que je vais avoir un attribut comme FieldTitleAttribute et l'utilisation de ce comme un en-tête de colonne.

Donc, ma question est, à quel point puis-je vérifier l'attribut et de l'insérer en-tête de colonnes? Quelqu'un a fait quelque chose de semblable auparavant?

Je voudrais obtenir les en-têtes inséré et l'utilisation du texte personnalisé différente de la véritable nom de champ juste en ayant un attribut pour chaque membre de l'objet:

[FieldTitleAttribute("Custom Title")]
private string Name

et peut-être une option à dire le moteur pour insérer l'en-tête lorsqu'il est généré.

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

J'ai trouvé un couple d'Événements pour DelimitedFileEngine, mais pas quelle est la meilleure façon de détecter si l'enregistrement en cours est la première ligne et comment insérer une ligne avant cette.

46voto

KiwiPiet Points 31

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

 FileHelperEngine<Person> engine = new FileHelperEngine<Person>();
engine.HeaderText = engine.GetFileHeader();
 

34voto

Richard Dingwall Points 1092

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

Pour l'utiliser, vous devez décorer votre champs avec [FieldOrder] (une bonne FileHelpers la pratique de toute façon). Utilisation:

[DelimitedRecord(","), IgnoreFirst(1)]
public class Person
{
    // Must specify FieldOrder too
    [FieldOrder(1), FieldTitle("Name")]
    string name;

    [FieldOrder(2), FieldTitle("Age")]
    int age;
}

...

var engine = new FileHelperEngine<Person>
{
    HeaderText = typeof(Person).GetCsvHeader()
};

...

engine.WriteFile(@"C:\people.csv", people);

Mais le soutien doit vraiment être ajoutée au sein de FileHelpers lui-même. Je ne peux penser à quelques questions de conception sur le dessus de ma tête qu'il serait nécessaire de répondre avant de pouvoir être mises en œuvre:

  • Ce qui se passe lors de la lecture d'un fichier? Autant que je sache FileHelpers est actuellement basée sur l'ordinal de position de la colonne, et ignore les noms de colonne... mais si, maintenant, nous avons [FieldHeader] attributs de partout, alors doit-on essayer de propriétés correspondantes avec les noms de colonnes dans le fichier? Si vous lancer une exception si elles ne correspondent pas? Qu'advient-il si la position ordinale n'est pas d'accord avec le nom de la colonne?
  • Lors de la lecture d'un tableau de données, vous devez utiliser A) le nom du champ (en cours de conception), ou B) le fichier source nom de la colonne, ou C) le FieldTitle attribut?

23voto

Saaman Points 468

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

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

Ensuite, lorsque vous appelez votre moteur:

 DelimitedFileEngine _engine = new DelimitedFileEngine<T> { HeaderText = HeaderLine };
 

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

6voto

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

1voto

Roger Points 308

J'ai constaté que vous pouvez utiliser FileHelperAsyncEngine pour accomplir cela. En supposant que vos données soient une liste appelée "output" de type "outputData", vous pouvez alors écrire un 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();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X