CSVHELPER Условно игнорировать записи полей, когда значения нулевые или пустые - PullRequest
0 голосов
/ 30 мая 2019

В настоящее время я записываю плоский объект DTO в CSV с помощью csvwriter csvhelper.Есть ли способ условно игнорировать определенные поля, если они еще не были инициализированы или являются пустыми в маппере?Я вижу, что флаг игнорирования принимает логическое значение, но как мне получить доступ к соответствующему полю, чтобы проверить это?

Приносим извинения, если на этот вопрос был дан ответ в другом месте, но он выполнил поиск как проблем github, так и стека overoverflow.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Я был немного смущен вопросом, потому что Игнорировать - это все или ничего. Вы не можете игнорировать поле построчно. Вы либо включаете поле, либо нет. Вы можете игнорировать поле, если, скажем, все записи имели нулевое или пустое значение для определенной переменной-члена.

public static void Main(string[] args)
{    
    var records = new List<Foo> { new Foo { Id = 1, Name = "" }, new Foo { Id = 2 } };

    using (var csv = new CsvWriter(Console.Out))
    {        
        var shouldIgnoreName = records.All(foo => string.IsNullOrEmpty(foo.Name));

        var classMap = new DefaultClassMap<Foo>();
        classMap.AutoMap();
        classMap.Map(m => m.Name).Ignore(shouldIgnoreName);

        csv.Configuration.RegisterClassMap(classMap);
        csv.WriteRecords(records);
    }

    Console.ReadKey();
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}        
0 голосов
/ 03 июня 2019

Ответом для меня было передать коллекцию полей / столбцов, которые будут игнорироваться в маппере. Это потребовало от меня проверки сбора данных на наличие пустых значений во всех строках, если так, то я могу полностью пропустить этот столбец. Затем я передаю эту коллекцию requiredFields в маппер следующим образом.

public sealed class ApplicationCsvWriterMap : ClassMap<ApplicationDto>
{
    public ApplicationCsvWriterMap(List<string> requiredFields)
    {
        Map(m => m.Id).Index(1).Name("AppId").Ignore(!requiredFields.Contains("id"));
        Map(m => m.Status.Text).Index(2).Name("Status").Ignore(!requiredFields.Contains("status"));
        Map(m => m.ApplicationTimestamp).Index(3).Ignore(!requiredFields.Contains("applicationTimestamp"));
        Map(m => m.LastModified).Index(4).Ignore(!requiredFields.Contains("lastModified"));

Затем я могу настроить маппер следующим образом, передав коллекцию requiredFields примерно так

  else if (results.Data is List<Application> applications)
            {
                csvWriter.Configuration.RegisterClassMap(new ApplicationCsvWriterMap(results.RequiredFields));
                csvWriter.WriteRecords(_dtoMapper.MapApplications(applications));
            }
...