Serialize dynamic list to CSV without header in Servicestack.Text

331 views Asked by At

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.

1

There are 1 answers

0
Alex S. Diaz On

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