Как я могу писать заголовки с пробелами с помощью CsvHelper?

Я использую библиотеку CsvHelper для создания файла CSV из IEnumerable<Person>, где Person - базовый класс.

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

Мне нужно написать заголовки в кавычках, т.е. вместо «DisplayName» столбец в итоговом файле должен быть «Display Name».

Как я могу это сделать?


person kjv    schedule 25.09.2017    source источник
comment
С #? Что-то другое?   -  person doctorlove    schedule 25.09.2017


Ответы (2)


Создайте 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
person Josh Close    schedule 26.09.2017
comment
Есть ли способ сделать это универсальным? - person nawfal; 28.11.2017
comment
Что вы имеете в виду под общим? - person Josh Close; 29.11.2017
comment
Извините, я имел в виду, есть ли способ, которым включение пробела в свойства составного слова может обрабатываться в общем / автоматически (для любого объекта) вместо написания настраиваемых картографов. Например, свойство AccountType должно соответствовать заголовку Account Type. Во время чтения это возможно, установив свойство в CsvReader. Но для записи у нас нет. - person nawfal; 29.11.2017
comment
У меня похожая проблема. В ClassMap мое поле сопоставляется с Map (m = ›m.ReportingGroup) .Name (Reporting Group), но записанный заголовок становится ReportingGroup. Выложу отдельный вопрос. - person disassemble-number-5; 20.12.2017
comment
@nawfal Я бы посоветовал спросить о проблемах с github. github.com/JoshClose/CsvHelper/issues - person Josh Close; 22.12.2017
comment
Для тех, кто попробует это в 2019 году, вам нужно будет изменить CsvClassMap ‹Person› на ClassMap ‹Person› - person guyfromfargo; 08.07.2019

У меня не было заголовков с обходным решением, поэтому вместо этого я использовал этот быстрый обходной путь:

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

Это берет имена свойств и заменяет подчеркивание пробелом, поэтому я могу просто назвать свойства подчеркиванием вместо пробелов, и оно будет правильно отображено.

Однако для этого требуется, чтобы вы использовали параметр HasHeaderRecord = false в CsvWriter.

person Johny Skovdal    schedule 12.01.2021