2013-04-16 317 views
10

私はCsvHelperを使用してCSVファイルを読み書きしています。それは素晴らしいですが、選択したタイプのフィールドのみを書き込む方法はわかりません。CsvHelperで選択したクラスフィールドのみをCSVに書き込む方法は?

私は動的に除外するために使用することができますどのような
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ファイルから、「数量」CsvField

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のタイプフィールド?

結果ファイルを処理する必要がある場合は、CsvHelperでCSV列全体を削除する方法がわかりません。フィールドこのような

答えて

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

関連する問題