CsvHelper ищет несуществующие столбцы - PullRequest
0 голосов
/ 04 августа 2020

Проблема: В объекте или CSV-файле нет поля «Имя», но CsVHelper продолжает искать «Имя» в заголовке. Так почему он там отключается и какие исправления?

При попытке построить объекты из файла csv возникает следующая ошибка:

CsvHelper.HeaderValidationException: Header with name 'Name' was not found. If you are expecting some headers to be missing and want to ignore this validation, set the configuration HeaderValidated to null. You can also change the functionality to do something else, like logging the issue.
   at CsvHelper.Configuration.ConfigurationFunctions.HeaderValidated(Boolean isValid, String[] headerNames, Int32 headerNameIndex, ReadingContext context)

Я попытался установить HeaderValidated на null , но получили те же результаты.

Заголовок csv: Id|Title|Description|AssignedToUserId|SourceUserId|DateCreated|DateAssigned|DateCompleted|Notes

Код синтаксического анализа:

private static IEnumerable<T> GetCSVData<T>(string fullFileName)
{
    PrintMembers<T>();
    using (var reader = new StreamReader(fullFileName))
    {
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            csv.Configuration.HasHeaderRecord = true;
            csv.Configuration.IncludePrivateMembers = false;
            csv.Parser.Configuration.Delimiter = "|";

            var records = csv.GetRecords<T>().ToList();
            return records;
        }
    }
}

Быстрая функция для вывода списка publi c свойства и поля класса (T), передаваемые в выходных данных, следующие:

Properties...
        Id
        AssignedToUserId
        SourceUserId
        Title
        Description
        AssignedTo
        Source
        DateCreated
        DateAssigned
        DateCompleted
        RelatedTasks
        Notes
Fields...
        [None]

У всех есть геттеры и сеттеры.

EDIT

IntermediateTask - это общий c, загружаемый в GetCSVData (). У него есть конструктор по умолчанию. IntermediateTask является внутренним, но находится в той же сборке, что и GetCSVData ().

Код для рассматриваемого класса (ов):

internal class IntermediateTask : Task
{
    private int _Id;
    new public int Id 
    {
        get { return _Id; }
        set { _Id = value; }
    }

    private int _AssignedToUserId;
    public int AssignedToUserId
    {
        get { return _AssignedToUserId; }
        set 
        {
            _AssignedToUserId = value;
            base.AssignedTo = userManager.Get(_AssignedToUserId); 
        }
    }

    private int _SourceUserId;
    public int SourceUserId
    {
        get { return _SourceUserId; }
        set 
        {
            this._SourceUserId = value;
            base.Source = userManager.Get(_SourceUserId); 
        }
    }

    public IntermediateTask() : base("", "", new IntermediateUser(), new IntermediateUser())
    {
    }
}


public class Task
{
    public Task(string title, string description, User assignedTo, User source, DateTime? dateCreated = null, int id = 0)
    {
        this.RelatedTasks = new List<Task>();
        this.Title = title;
        this.Description = description;
        this.AssignedTo = assignedTo;
        this.Source = source;
        this.DateCreated = dateCreated ?? DateTime.Now;
        this.Id = id;
    }
    private int _Id;
    public int Id
    {
        get { return _Id; }
        protected set { _Id = value; }
    }

    public string Title { get; set; }
    public string Description { get; set; }
    public User AssignedTo { get; set; }
    public User Source { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime? DateAssigned { get; set; }
    public DateTime? DateCompleted { get; set; }
    public IList<Task> RelatedTasks { get; set; }
    public string Notes { get; set; }
    
    override public string ToString()
    {
        return $"Id:  {Id};  Title:  {Title}";
    }
}

1 Ответ

0 голосов
/ 04 августа 2020

В моем случае он жаловался на отсутствие AssignedTo, но на самом деле это свойство класса, которого нет в csv, поэтому мне пришлось добавить эти две строки, чтобы заставить его работать:

csv.Configuration.HeaderValidated = null;
csv.Configuration.MissingFieldFound = null;

Я не знаю, почему это могло появиться с «Имя», если у вас нет чего-то другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...