2013-04-16 158 views
10

我使用CsvHelper來讀取和寫入CSV文件,這很好,但我不明白如何只寫入選定的類型字段。如何僅使用CsvHelper將選定的類字段寫入CSV?

說我們有:

using CsvHelper.Configuration; 

namespace Project 
{ 
    public class DataView 
    { 
     [CsvField(Name = "N")] 
     public string ElementId { get; private set; } 

     [CsvField(Name = "Quantity")] 
     public double ResultQuantity { get; private set; } 

     public DataView(string id, double result) 
     { 
      ElementId = id; 
      ResultQuantity = result; 
     } 
    } 
} 

,我們希望排除造成CSV文件中「數量」 CsvField,我們通過類似目前產生:

using (var myStream = saveFileDialog1.OpenFile()) 
{ 
    using (var writer = new CsvWriter(new StreamWriter(myStream))) 
    { 
     writer.Configuration.Delimiter = '\t'; 
     writer.WriteHeader(typeof(ResultView)); 
     _researchResults.ForEach(writer.WriteRecord); 
    } 
} 

我能怎麼使用動態排除來自CSV的類型字段?

如果有必要,我們可以處理生成的文件,但我不知道如何刪除整個CSV列CsvHelper

回答

4

你可以這樣做:

using (var myStream = saveFileDialog1.OpenFile()) 
{ 
    using (var writer = new CsvWriter(new StreamWriter(myStream))) 
    { 
     writer.Configuration.AttributeMapping(typeof(DataView)); // Creates the CSV property mapping 
     writer.Configuration.Properties.RemoveAt(1); // Removes the property at the position 1 
     writer.Configuration.Delimiter = "\t"; 
     writer.WriteHeader(typeof(DataView)); 
     _researchResults.ForEach(writer.WriteRecord); 
    } 
} 

我們正在迫使屬性映射的創建,然後修改它,動態消除列。

+4

這是用於CsvHelper的舊版本嗎?當我深入研究'writer.configuration'時,'AttributeMapping'和'Properties'不存在? –

2

馬克領域是這樣的:

[CsvField(Ignore = true)] 
public double ResultQuantity { get; private set; } 

更新:沒關係。我看到你想在運行時執行此操作,而不是編譯時間。我會把它作爲可能犯同樣錯誤的其他人的紅旗。

+2

而且,'CsvFieldAttribute'在2.0版本中刪除。 – Wally

12

我最近需要通過確定在運行時包含哪些字段來獲得類似的結果。這是我的方法:

  1. 創建一個映射文件映射哪些字段,我需要在運行時通過傳遞一個枚舉到類的構造函數

    public sealed class MyClassMap : CsvClassMap<MyClass> 
    { 
        public MyClassMap(ClassType type) 
        { 
         switch (type) 
         { 
          case ClassType.TypeOdd 
           Map(m => m.Field1); 
           Map(m => m.Field3); 
           Map(m => m.Field5);     
           break; 
          case ClassType.TypeEven: 
           Map(m => m.Field2); 
           Map(m => m.Field4); 
           Map(m => m.Field6);     
           break; 
          case ClassType.TypeAll: 
           Map(m => m.Field1); 
           Map(m => m.Field2); 
           Map(m => m.Field3); 
           Map(m => m.Field4); 
           Map(m => m.Field5); 
           Map(m => m.Field6);     
           break; 
         } 
        } 
    } 
    
  2. 寫出記錄使用映射配置

    using (var memoryStream = new MemoryStream()) 
    using (var streamWriter = new StreamWriter(memoryStream)) 
    using (var csvWriter = new CsvWriter(streamWriter)) 
    { 
        csvWriter.Configuration.RegisterClassMap(new MyClassMap(ClassType.TypeOdd)); 
        csvWriter.WriteRecords(records); 
        streamWriter.Flush(); 
        return memoryStream.ToArray(); 
    } 
    
+1

這是最新的正確方法(截至2015年12月)。 – Ted

+0

在CSV文件中寫入選定字段的最佳方法.. – Nirman

相關問題