首页 > 解决方案 > 用 List 写一个对象字段到 CSV

问题描述

我正在学习 C# 和对象序列化。我需要将对象保存在 .csv 文件中。我尝试了 CsvHelper但找不到我的问题的答案。

假设我有一个像这样的对象:

public class Record
{
    ...
    public List<string> Collection { get; set; }
    ...
}

如何使用CsvHelperCollection的值与 csv 文件记录中的其他原始类型一起存储在 .csv 文件中?

标签: c#csvcsvhelper

解决方案


默认情况下会忽略集合CsvHelper。但是,ClassMap您可以使用aIndex来表示您想要一个简单的字符串集合与其他属性一起输出。(没有很好的记录。)

public class Program
{
    public static void Main(string[] args)
    {
        var records = new List<Record>
        {
            new Record { Id = 1, Name = "Record1", Collection = new List<string>{"First", "Second", "Third"}},
            new Record { Id = 2, Name = "Record2", Collection = new List<string>{"First", "Second"}},
        };

        using (var csv = new CsvWriter(Console.Out))
        {
            csv.Configuration.HasHeaderRecord = false;
            csv.Configuration.RegisterClassMap<RecordMap>();

            csv.WriteRecords(records);
        }

        Console.ReadKey();
    }

}

public class RecordMap : ClassMap<Record>
{
    public RecordMap()
    {
        Map(m => m.Id);
        Map(m => m.Name);
        Map(m => m.Collection).Index(3);
    }
}

public class Record
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<string> Collection { get; set; }
}

输出:

1,Record1,First,Second,Third
2,Record2,First,Second

如果您知道集合中的最大项目数,您还可以设置结束索引并CsvHelper为每个集合项目创建标题。

public class RecordMap : ClassMap<Record>
{
    public RecordMap()
    {
        Map(m => m.Id);
        Map(m => m.Name);
        Map(m => m.Collection).Index(3, 5);
    }
}

删除csv.Configuration.HasHeaderRecord = false;,现在它还会为您打印标题记录。输出:

Id,Name,Collection1,Collection2,Collection3
1,Record1,First,Second,Third
2,Record2,First,Second

推荐阅读