简体   繁体   English

在 Servicestack.Text 中将动态列表序列化为 CSV 而没有 header

[英]Serialize dynamic list to CSV without header in Servicestack.Text

I'm trying to generate a csv file using CsvSerializer.SerializeToCsv(data) , but I want to omit the headers.我正在尝试使用CsvSerializer.SerializeToCsv(data)生成 csv 文件,但我想省略标题。

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.这两个选项都用我不需要的标题序列化 csvFile。

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.其中 FillInnerQuotes 只是一种基于 rfc4180 标准管理特殊字符的扩展方法。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM