使用fileHelpers库的CSV列标题?

在FileHelper库中有一个内置的字段属性,它将在最终生成的CSV中添加一个标题行?

我有谷歌search,没有find关于它的很多信息。 目前我有这个:

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

它工作,但没有标题。

我正在考虑像FieldTitleAttribute这样的属性,并将其用作列标题。

所以,我的问题是在哪一点检查属性和插入标题列? 有没有人做过类似的事情?

我想要插入标题,并使用不同于实际字段名称的自定义文本,只需在对象的每个成员上都有一个属性即可:

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

也可以select在生成时告诉引擎插入标题。

所以当调用WriteStreamWriteString时,标题行将被插入自定义标题。

我已经find了一些关于DelimitedFileEngine的事件,但没有什么是检测当前logging是否是第一行以及如何在此之前插入行的最佳方法。

这里有一些代码可以做到这一点: https : //gist.github.com/1391429

要使用它,你必须用[FieldOrder]来装饰你的领域(一个好的FileHelpers练习)。 用法:

 [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); 

但支持这真的需要在FileHelpers本身添加。 我可以从头脑中想出几个devise问题,在实现之前需要回答:

  • 阅读文件时会发生什么? Afaik FileHelpers目前全部基于序号列位置,并忽略列名…但如果我们现在有[FieldHeader]属性,那么我们是否也应该在文件中尝试匹配属性和列名称? 如果他们不匹配,你应该抛出一个exception吗? 如果序号与列名不一致会发生什么?
  • 当作为数据表读取时,应该使用A)字段名称(当前devise)还是B)源文件列名称,或者C)FieldTitle属性?

我知道这是一个古老的问题,但这是一个适用于v2.9.9的答案

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

我不知道你是否仍然需要这个,但FileHelper的工作方式如下:要包含列的标题,你需要定义一个string,标题的分隔方式与文件相同。 例如用'|' 作为分隔符:

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

然后,在调用你的引擎时:

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

如果您不想编写标题,则不要在引擎上设置HeaderText属性。

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

我发现你可以使用FileHelperAsyncEngine来完成这个任务。 假设你的数据是一个types为“outputData”的名为“output”的列表,那么你可以编写如下所示的代码:

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