簡體   English   中英

CSV 中的列標題使用 fileHelpers 庫?

[英]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 時插入它。

因此,當調用WriteStreamWriteString時,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 本身中添加對此的支持。 我可以想到一些在實施之前需要回答的設計問題:

  • 讀取文件時會發生什么? Afaik FileHelpers 目前全部基於序號列位置並忽略列名......但是如果我們現在到處都有[FieldHeader]屬性,那么我們還應該嘗試將屬性與文件中的列名匹配嗎? 如果它們不匹配,是否應該拋出異常? 如果序數位置與列名不一致會發生什么?
  • 當作為數據表讀取時,您應該使用 A)字段名稱(當前設計),還是 B)源文件列名稱,或 C)FieldTitle 屬性?

我不知道您是否仍然需要這個,但 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM