Как вы реализуете (и обнуляете) BadDataFound

В соответствии с инструкциями из раздела Начало работы с CsvHelper у меня есть следующий код, за исключением строки csv.Configuration.BadDataFound:

using (var csv = new CsvReader(tr, CultureInfo.InvariantCulture))
        {
            List<string> badPeople = new List<string>();
            csv.Configuration.BadDataFound = context => badPeople.Add(context.RawRecord);
            try
            {
                var people = csv.GetRecords<Person>();
                var count = people.Count();
                response = await Http.PostAsJsonAsync("api/people/batch", people);
                Message = $"{response}: {selectedFile.Count} file uploaded";
            }
            catch (Exception ex)
            {
                Message = ex.Message;
            }
        }

Я настроил строку BadDataFound на основе следующих предложений:

В документации CsvHelper.Configuration говорится:

Получает или задает функцию, вызываемую при обнаружении неверных данных поля. Поле содержит неверные данные, если оно содержит кавычки и поле не заключено в кавычки (экранировано). Вы можете предоставить свою собственную функцию для других вещей, например, для регистрации проблемы, вместо того, чтобы генерировать исключение. Аргументы: контекст

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

Что еще больше усложняет ситуацию, в том контексте, который я могу найти, также нет RawRecord.

Как мне заставить это работать?


person PirateQueen    schedule 15.02.2021    source источник


Ответы (1)


В версии 20.0.0 Джош изменил CsvConfiguration на запись только для чтения для устранения проблем с потоками. Вам необходимо заранее создать конфигурацию и передать ее в _1 _ / _ 2_.

RawRecord сейчас находится на синтаксическом анализаторе.

Однако я заметил, что он создал запись, даже если были неверные данные, и дважды ввел RawRecord в badPeople.

void Main()
{
    var badPeople = new List<string>();
    var Message = string.Empty;
    var people = new List<Person>();
    
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        BadDataFound = arg => badPeople.Add(arg.Context.Parser.RawRecord)
    };

    using (var tr = new StringReader("Id,FirstName,LastName\n1,Foo,Bar\n2,Foo\"Bar,Baz\n3,Foo\"Baz,Bar"))
    using (var csv = new CsvReader(tr, config))
    {       
        try
        {
            people = csv.GetRecords<Person>().ToList();
            var count = people.Count();
        }
        catch (Exception ex)
        {
            Message = ex.Message;
        }
    }
    people.Dump();
    badPeople.Dump();
}

public class Person 
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
person David Specht    schedule 17.02.2021