如何使用CsvHelper编写带有空格的标题?

7

我正在使用CsvHelper库从一个基本类PersonIEnumerable<Person>生成CSV文件。

public class Person
{
    public string DisplayName { get; set; }
    public int Age { get; set; }
}

我需要编写引用标题,即在生成的文件中,“DisplayName”列应为“Display Name”。

我该如何实现这一要求?


1
C#?还是其他什么? - doctorlove
2个回答

9
创建一个 ClassMap
void Main()
{
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    using (var reader = new StreamReader(stream))
    using (var csv = new CsvWriter(writer))
    {
        var records = new List<Person>
        {
            new Test { DisplayName = "one", Age = 1},
            new Test { DisplayName = "two", Age = 2 },
        };
        
        csv.Configuration.RegisterClassMap<PersonMap>();
        csv.WriteRecords(records);
        
        writer.Flush();
        stream.Position = 0;
        
        Console.WriteLine(reader.ReadToEnd());
    }
}

public class Person
{
    public string DisplayName { get; set; }
    public int Age { get; set; }
}

public sealed class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Map(m => m.DisplayName).Name("Display Name");
        Map(m => m.Age);
    }
}

输出:

Display Name,Age
one,1
two,2

3
有没有一种方法可以使其变成通用的? - nawfal
什么是泛型? - Josh Close
1
抱歉,我的意思是,是否有一种通用/自动的方式(适用于任何对象),可以处理包含复合词属性中的空格,而不是编写自定义映射器。例如,属性“AccountType”应对应标题“Account Type”。在读取时,可以通过在CsvReader上设置属性来实现。但是,在写入时我们没有这样的选项。 - nawfal
我遇到了类似的问题。在ClassMap中,我的字段被映射为Map(m => m.ReportingGroup).Name("Reporting Group"),但是生成的标题变成了"ReportingGroup"。我会发布一个单独的问题。 - disassemble-number-5
@nawfal 我建议你在 Github 的 issues 上提问。https://github.com/JoshClose/CsvHelper/issues - Josh Close
3
如果有人在2019年尝试,请将"CsvClassMap<Person>"更改为"ClassMap<Person>"。 - guyfromfargo

0

我没有头文件,所以我使用了这个快速解决方法:

foreach (var property in typeof(MyCsvClass).GetProperties())
{
  csvWriter.WriteField(property.Name.Replace('_', ' '));
}
csvWriter.NextRecord();
csvWriter.WriteRecords(models);

该函数将属性名称中的下划线替换为空格,因此我可以使用带有下划线而不是空格的属性名称,以便进行正确的映射。
然而,这需要在 CsvWriter 上使用 HasHeaderRecord = false 选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接