首页 > 解决方案 > 将动态列表序列化为 CSV,Servicestack.Text 中没有标题

问题描述

我正在尝试使用 生成 csv 文件CsvSerializer.SerializeToCsv(data),但我想省略标题。

我读了这个问题,但这不起作用,因为我正在使用动态对象列表。

我试过了:

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

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

这两个选项都用我不需要的标题序列化 csvFile。

标签: c#servicestack-text

解决方案


由于我没有找到使用库的方法,因此我选择手动执行此操作。像这样的东西对我有用:

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

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

推荐阅读