CSVHELPER 在值为 null 或空时有条件地忽略写入字段

CSVHELPER Conditionally ignore writing fields when values null or empty

我目前正在使用 csvhelper 的 csvwriter 将扁平化的 DTO 对象写入 CSV。如果某些字段尚未初始化或在映射器中为空,是否有办法有条件地忽略它们?我看到忽略标志采用布尔值,但我如何才能访问相关字段以对此进行测试。

抱歉,如果这个问题已在别处得到解答,但已搜索 github 问题和 Whosebug。

我对这个问题有点困惑,因为忽略是全有或全无。您不能逐行忽略字段。您要么包含该字段,要么不包含。如果说所有记录的特定成员变量的值为 null 或空值,您可以忽略一个字段。

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; }
}        

我的答案是传入 fields/columns 的集合以忽略映射器。这涉及到我检查数据集合中所有行上的任何空值,如果是这样,那么我可以完全省略该列。然后我像这样将这个 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));
            }