2013-04-16 19 views
10

Tôi sử dụng CsvHelper để đọc và ghi tệp CSV và rất tuyệt, nhưng tôi không hiểu cách viết chỉ các trường loại đã chọn.Làm cách nào để chỉ ghi các trường lớp đã chọn vào CSV bằng CsvHelper?

Giả sử chúng ta có:

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; 
     } 
    } 
} 

và chúng tôi muốn loại trừ "Số lượng" CsvField từ kết quả tập tin CSV mà chúng tôi hiện đang tạo ra thông qua một cái gì đó như:

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); 
    } 
} 

Những gì tôi có thể sử dụng để tự động loại trừ trường loại từ CSV?

Nếu cần thiết, chúng tôi có thể xử lý tệp kết quả, nhưng tôi không biết cách xóa toàn bộ cột CSV bằng CsvHelper.

Trả lời

4

Bạn có thể làm điều này:

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); 
    } 
} 

Chúng tôi đang buộc việc tạo ra các bản đồ thuộc tính và sau đó sửa đổi nó, loại bỏ các cột năng động.

+4

Đây có phải là phiên bản cũ của CsvHelper không? 'AttributeMapping' và' Properties' không tồn tại khi tôi đi sâu vào 'writer.configuration'? –

2

Đánh dấu ruộng như thế này:

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

Cập nhật: Nevermind. Tôi thấy bạn muốn làm điều này trong thời gian chạy, chứ không phải là thời gian biên dịch. Tôi sẽ để lại điều này như là lá cờ đỏ cho bất cứ ai khác có thể mắc phải sai lầm tương tự.

+2

Và, 'CsvFieldAttribute' được loại bỏ trong phiên bản 2.0. – Wally

12

Gần đây tôi cần đạt được kết quả tương tự bằng cách xác định các trường cần bao gồm trong thời gian chạy. Đây là cách tiếp cận của tôi:

  1. Tạo một file bản đồ để lập bản đồ các lĩnh vực mà tôi cần trong thời gian chạy bằng cách thông qua trong một enum vào constructor lớp

    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. Viết ra các hồ sơ để sử dụng cấu hình bản đồ

    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

Đây là cách thực hiện chính xác nhất (tính đến tháng 12 năm 2015). – Ted

+0

phương pháp tốt nhất để viết các trường đã chọn trong tệp CSV .. – Nirman