0

I'm trying to generate a csv file using CsvSerializer.SerializeToCsv(data), but I want to omit the headers.

I read this question, but this is not working as I'm using a list of dynamic objects.

I've tried:

IEnumerable<dynamic> data = ...;
CsvConfig<object>.OmitHeaders = true;
string csvFile = CsvSerializer.SerializeToCsv(data);

And

IEnumerable<dynamic> data = ...;
CsvConfig<dynamic>.OmitHeaders = true;
string csvFile = CsvSerializer.SerializeToCsv(data);

Both options are serializing the csvFile with headers, which I don't need.

Alex S. Diaz
  • 2,637
  • 2
  • 23
  • 35

1 Answers1

1

Since I didn't find a way with a library, I opt to do this manually. Something like this worked for me:

var parsedData = new List<string>();
// parse data into comma separated objects
parsedData.AddRange(data.Select(d =>
{
    var dProperties = (IDictionary<string, object>)d;
    var valuesFixed = dProperties.Values.Select(v => v.ToString().ToRFC4180String());
    return string.Join(",", valuesFixed);
}));
var file = string.Join("\r\n", parsedData);

Where FillInnerQuotes is just an extensor method to manage special characters based on rfc4180 standard.

public static string ToRFC4180String(this string value)
{
    if(value.Contains("\""))
        value = value.Replace("\"", "\"\"");
    if(value.Contains("\"") 
        || value.Contains("\n") 
        || value.Contains("\r") 
        || value.Contains("\r\n") 
        || value.Contains(","))
        return $"\"{value}\"";

    return value;
}
Alex S. Diaz
  • 2,637
  • 2
  • 23
  • 35