CSV文件中的列标题使用fileHelpers库?

Hei*_*nge 49 c# csv filehelpers

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

我用Google搜索并没有找到太多信息.目前我有这个:

DelimitedFileEngine _engine = new DelimitedFileEngine(T);
_engine.WriteStream
        (HttpContext.Current.Response.Output, dataSource, int.MaxValue);
Run Code Online (Sandbox Code Playgroud)

它工作,但没有标题.

我正在考虑FieldTitleAttribute使用类似的属性并将其用作列标题.

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

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

[FieldTitleAttribute("Custom Title")]
private string Name
Run Code Online (Sandbox Code Playgroud)

并且可能是一个选项,告诉引擎在生成时插入标题.

因此,当WriteStream或者WriteString被调用时,标题行将与自定义标题插入.

我找到了几个DelimitedFileEngine的事件,但不是检测当前记录是第一行以及如何在此之前插入行的最佳方法.

Kiw*_*iet 41

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

FileHelperEngine<Person> engine = new FileHelperEngine<Person>();
engine.HeaderText = engine.GetFileHeader();
Run Code Online (Sandbox Code Playgroud)

  • 要覆盖 `GetFileHeader()` 生成的默认列标题,请使用 `[FieldCaption]` 属性装饰字段。 (5认同)
  • 这应该是选定的答案. (4认同)
  • 这也是他们的常见问题解答中的推荐方法:http://www.filehelpers.net/mustread/在“我想编写带有标题的文件”下 (3认同)

Ric*_*all 32

这里有一些代码可以执行: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);
Run Code Online (Sandbox Code Playgroud)

但实际上需要在FileHelpers中添加对此的支持.我可以想到一些在我能够实现之前需要回答的设计问题:

  • 阅读文件时会发生什么?Afaik FileHelpers目前都基于序列列位置并忽略列名...但是如果我们现在在[FieldHeader]各处都有属性,那么我们是否应该尝试将属性与文件中的列名匹配?如果它们不匹配,你应该抛出异常吗?如果序数位置与列名不一致会发生什么?
  • 当作为数据表读取时,您应该使用A)字段名称(当前设计),或B)源文件列名称,还是C)FieldTitle属性?

  • @Heinnge FieldOrderAttribute类位于FileHelpers 2.9.9.0库中. (2认同)

Saa*_*man 23

我不知道你是否仍然需要这个,但这里是FileHelper的工作方式:要包含列的标题,你需要定义一个字符串,其标题与文件的分隔方式相同.例如"|" 作为分隔符:

 public const string HeaderLine = @"COLUMN1|COLUMN2|COLUMN3|...";
Run Code Online (Sandbox Code Playgroud)

然后,在调用引擎时:

DelimitedFileEngine _engine = new DelimitedFileEngine<T> { HeaderText = HeaderLine };
Run Code Online (Sandbox Code Playgroud)

如果您不想编写标题,只需HeaderText在引擎上设置属性即可.


小智 6

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);
Run Code Online (Sandbox Code Playgroud)

  • 用于获取字段名称的稍微简单构建:VAR = HEADERTEXT的string.join( "" 的typeof(MyClass的).GetFields()选择(F => f.Name).ToList()); FileHelperEngine engine = new FileHelperEngine <MyClass>(){HeaderText = headerText}; (2认同)