[英]Column headers in CSV using fileHelpers library?
FileHelper 庫中是否有內置字段屬性,它將在最終生成的 CSV 中添加 header 行?
我用谷歌搜索並沒有找到太多關於它的信息。 目前我有這個:
DelimitedFileEngine _engine = new DelimitedFileEngine(T);
_engine.WriteStream
(HttpContext.Current.Response.Output, dataSource, int.MaxValue);
它可以工作,但沒有 header。
我正在考慮使用像FieldTitleAttribute
這樣的屬性並將其用作列 header。
所以,我的問題是在什么時候檢查屬性並插入 header 列? 有沒有人做過類似的事情?
我想插入標題並使用與實際字段名稱不同的自定義文本,只需在 object 的每個成員上都有一個屬性:
[FieldTitleAttribute("Custom Title")]
private string Name
並且也許可以選擇告訴引擎在生成 header 時插入它。
因此,當調用WriteStream
或WriteString
時,header 行將插入自定義標題。
我為 DelimitedFileEngine 找到了幾個事件,但不是檢測當前記錄是否是第一行以及如何在此之前插入一行的最佳方法。
我知道這是一個老問題,但這里有一個適用於 v2.9.9 的答案
FileHelperEngine<Person> engine = new FileHelperEngine<Person>();
engine.HeaderText = engine.GetFileHeader();
這是一些可以做到的代碼: 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 本身中添加對此的支持。 我可以想到一些在實施之前需要回答的設計問題:
[FieldHeader]
屬性,那么我們還應該嘗試將屬性與文件中的列名匹配嗎? 如果它們不匹配,是否應該拋出異常? 如果序數位置與列名不一致會發生什么?我不知道您是否仍然需要這個,但 FileHelper 的工作方式是這樣的:要包含列標題,您需要定義一個字符串,其中標題的分隔方式與您的文件相同。 例如用“|” 作為分隔符:
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);
只是為了包含一個更完整的示例,它可以為我節省一些時間,用於 FileHelpers NuGet 包的 3.4.1 版......
給定的
[DelimitedRecord(",")]
public class Person
{
[FieldCaption("First")]
public string FirstName { get; set; }
[FieldCaption("Last")]
public string LastName { get; set; }
public int Age { get; set; }
}
和這個代碼來創建它
static void Main(string[] args)
{
var people = new List<Person>();
people.Add(new Person() { FirstName = "James", LastName = "Bond", Age = 38 });
people.Add(new Person() { FirstName = "George", LastName = "Washington", Age = 43 });
people.Add(new Person() { FirstName = "Robert", LastName = "Redford", Age = 28 });
CreatePeopleFile(people);
}
private static void CreatePeopleFile(List<Person> people)
{
var engine = new FileHelperEngine<Person>();
using (var fs = File.Create(@"c:\temp\people.csv"))
using (var sw = new StreamWriter(fs))
{
engine.HeaderText = engine.GetFileHeader();
engine.WriteStream(sw, people);
sw.Flush();
}
}
你得到這個
First,Last,Age
James,Bond,38
George,Washington,43
Robert,Redford,28
我發現您可以使用 FileHelperAsyncEngine 來完成此操作。 假設您的數據是一個類型為“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();
您可以簡單地使用來自基礎 class 的 FileHelper 的 GetFileHeader function
var engine = new FileHelperEngine<ExportType>();
engine.HeaderText = engine.GetFileHeader();
engine.WriteFile(exportFile, exportData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.