thanhnguyen.1701
thanhnguyen.1701

Reputation: 45

CSVHelper write header using object property value

I have a list like this :

  List<ValueModel> list = new List<ValueModel>();

        for(var i = 1; i <= 3;i++)
        {
            lista.Add(new ValueModel
            {
                Name = string.Format("Header {0}",i),
                Value = string.Format("Value of Header {0}", i),
            });
        }

How do i use CSVHelper to write to csv so the output would be something like this(using the property's value) :

Header1,Header2,Header3
Value of Header1,Value of Header2,Value of Header3

Upvotes: 0

Views: 1273

Answers (1)

nlv
nlv

Reputation: 831

I'll assume you are referring to this CsvHelper library here. If not, please clarify this in your question.

To achieve your output you can use something like this:

var data = new List<ValueModel>(0);

data.Add(new ValueModel { Name= "Stack", Surname= "Overflow", Users = "1M" });
data.Add(new ValueModel { Name= "Stack", Surname= "ServerFault", Users = "0.5M" });

using (StreamWriter sw = new StreamWriter(@"C:\Temp\out.csv"))
using (CsvWriter cw = new CsvWriter(sw))
{
    cw.WriteHeader<ValueModel>();

    foreach (ValueModel rec in data)
    {
        cw.WriteRecord<ValueModel>(rec);
    }
}

The output will look something like this:

Name,Surname,Users
Stack,Overflow,1M
Stack,ServerFault,0.5M

I'd suggest to utilise property definition attributes described here so you can keep your naming convention in c# and easily add user friendly property names.

UPDATE (as per initial comment):

Below code will generate the wanted output.

var data = new List<ValueModel>(0);
    
using (StreamWriter sw = new StreamWriter(@"C:\Temp\out.csv"))
using (CsvWriter cw = new CsvWriter(sw))
{
  cw.WriteRecord(data.Select(x => x.Name).ToArray());    
  cw.WriteRecord(data.Select(x => x.Value).ToArray());
}

Of course, each case is unique but I'd suggest looking into using dictionaries if your object is { Name; Value }.

Upvotes: 1

Related Questions