缺少列时CSVHelper映射不起作用

时间:2018-10-22 15:43:45

标签: csvhelper

我一直在使用CSVHelper,我必须说这绝对是棒极了。当列不在文件中时,映射存在问题。

using (var stream = client.GetDownloadStream(string.Format("{0}{1}", _remoteFileDirectoryExports, remoteFileName)))
{
    using (var s = new StreamReader(stream))
    {
        var csv = new CsvReader(s, new Configuration()
        {
            HasHeaderRecord = true,
            HeaderValidated = null,
            MissingFieldFound = null
        });

        csv.Configuration.RegisterClassMap<EverTrueInteractionMap>();

        records = new List<T>();

        foreach (var r in csv.GetRecords<T>())
        {
            records.Add(r);
        }
    }
}

我的映射类在下面。

public class EverTrueInteraction
{
    public string InteractionImportId { get; set; }     
    public string Solicitor1ImportId { get; set; }
    public string Solicitor1EverTrueId { get; set; }
    public string Solicitor1Name { get; set; }
    public string Solicitor2ImportId { get; set; }
    public string Solicitor2EverTrueId { get; set; }
    public string Solicitor2Name { get; set; }
    public string Solicitor3ImportId { get; set; }
    public string Solicitor3EverTrueId { get; set; }
    public string Solicitor3Name { get; set; }
    public string Solicitor4ImportId { get; set; }
    public string Solicitor4EverTrueId { get; set; }
    public string Solicitor4Name { get; set; }
    public string Solicitor5ImportId { get; set; }
    public string Solicitor5EverTrueId { get; set; }
    public string Solicitor5Name { get; set; }
}

public sealed class EverTrueInteractionMap : ClassMap<EverTrueInteraction>
{
    public EverTrueInteractionMap()
    {
        AutoMap();
        Map(m => m.Solicitor1ImportId).Default("");
        Map(m => m.Solicitor1EverTrueId).Default("");
        Map(m => m.Solicitor1Name).Default("");
        Map(m => m.Solicitor2ImportId).Default("");
        Map(m => m.Solicitor2EverTrueId).Default("");
        Map(m => m.Solicitor2Name).Default("");
        Map(m => m.Solicitor3ImportId).Default("");
        Map(m => m.Solicitor3EverTrueId).Default("");
        Map(m => m.Solicitor3Name).Default("");
        Map(m => m.Solicitor4ImportId).Default("");
        Map(m => m.Solicitor4EverTrueId).Default("");
        Map(m => m.Solicitor4Name).Default("");
        Map(m => m.Solicitor5ImportId).Default("");
        Map(m => m.Solicitor5EverTrueId).Default("");
        Map(m => m.Solicitor5Name).Default("");
    }
}

当Solicitor3-5不在文件中时,它们的值将返回null。 .Default(“”)不能为此工作吗?

1 个答案:

答案 0 :(得分:1)

我的理解是.Default()用于提供缺少的,但是您拥有的是缺少的 field

因此,如果您想将空字段替换为“ NOVALUE”,那么.Default()是您的理想选择。如果要处理完全丢失的列,则需要修改Configuration.MissingFieldFound设置和/或通过捕获异常来处理它。

请参阅: CsvHelper: Replace missing Csv field with another expression?

https://joshclose.github.io/CsvHelper/configuration/

您可以通过简单地在类属性本身上设置默认值来完成后续工作吗?只是在构建过程中将它们设置为空字符串?

例如

public string Solicitor3EverTrueId { get; set; } = "";