2013-04-16 17 views
10

Io uso CsvHelper per leggere e scrivere file CSV ed è ottimo, tuttavia non capisco come scrivere solo campi di testo selezionati.Come scrivere solo campi classe selezionati in CSV con CsvHelper?

dire che abbiamo avuto:

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

e abbiamo deciso di escludere i "Quantità" CsvField dalla risultante file CSV che attualmente generiamo attraverso qualcosa di simile:

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

Quello che ho potuto usare per escludere in modo dinamico un campo tipo dal CSV?

Se è necessario, è possibile elaborare il file risultante, tuttavia non so come rimuovere un'intera colonna CSV con CsvHelper.

risposta

4

Si può fare questo:

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

Stiamo forzando la creazione del mapping degli attributi e poi modificarlo, eliminando la colonna in modo dinamico.

+4

È per una vecchia versione di CsvHelper? 'AttributeMapping' e' Properties' non esistono quando approfondisco in 'writer.configuration'? –

2

Marcate il campo in questo modo:

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

Aggiornamento: Nevermind. Vedo che vuoi farlo in fase di esecuzione, piuttosto che compilare il tempo. Lascerò questo come bandiera rossa per chiunque altro possa commettere lo stesso errore.

+2

E, 'CsvFieldAttribute' è stato rimosso nella versione 2.0. – Wally

12

Recentemente ho avuto bisogno di ottenere un risultato simile determinando quali campi includere a runtime. Questo è stato il mio approccio:

  1. Creare un file di mapping per mappare quali campi ho bisogno in fase di esecuzione, passando in un enum nel costruttore della classe

    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. scrivere il record utilizzando la configurazione di mapping

    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

Questo è il modo corretto di fare l'ultimo (a partire da dicembre 2015). – Ted

+0

il metodo migliore per scrivere campi selezionati nel file CSV .. – Nirman

Problemi correlati