Сопоставление 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 ("") не работать для этого?


person Chris Whisenhunt    schedule 22.10.2018    source источник
comment
У кого-нибудь есть понимание этого?   -  person Chris Whisenhunt    schedule 24.10.2018


Ответы (1)


Насколько я понимаю, .Default() предназначен для предоставления отсутствующего значения, но у вас есть отсутствующее поле.

Итак, если вы хотите заменить пустые поля на «NOVALUE», тогда .Default() — ваш выбор. Если вы хотите обработать полностью отсутствующий столбец, вам потребуется изменить параметр Configuration.MissingFieldFound и/или обработать его, перехватив исключение.

См.: CsvHelper: заменить отсутствующее поле Csv другим выражением?

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

Не могли бы вы выполнить то, что вам нужно, просто установив значение по умолчанию для самих атрибутов вашего класса? Просто установить их в пустую строку во время построения?

e.g.

public string Solicitor3EverTrueId { get; set; } = "";
person Tim Kaiser    schedule 24.10.2018
comment
Значение по умолчанию для моего класса сработало отлично. Спасибо Тим! - person Chris Whisenhunt; 24.10.2018