将具有List <T>字段的对象写入CSV

时间:2019-11-21 15:44:29

标签: c# csv csvhelper

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

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

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

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

1 个答案:

答案 0 :(得分:1)

默认情况下,CsvHelper将忽略集合。但是,使用ClassMap可以使用Index来表示您希望将简单的字符串集合与其他属性一起输出。 (没有充分记录。)

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