Как обрабатывать пустой столбец при синтаксическом анализе с помощью CsvHelper?


У меня есть CSV-файл, я пытаюсь его разобрать, но получаю следующую ошибку на int datatype column.In файл, я передаю пустое или пустое значение для этого столбца.

[AutoMap(typeof(Test))]
[FileEntity("Test")]
public class TestFileEntity : BaseFileEntity
{
    [CsvFileColumn(1)]
    public int TestId { get; set; }
}

public IEnumerable<BaseFileEntity> Parse(Stream masterData, Type entityType, out IEnumerable<MasterDataFileParserError> errors)
{
    var list = new List<BaseFileEntity>();
    var errorList = new List<MasterDataFileParserError>();

    try
    {
        using (var reader = new StreamReader(masterData))
        {
            var parser = new CsvReader(reader, new CsvHelper.Configuration.Configuration
            {
                HasHeaderRecord = true,
                HeaderValidated = null,
                MissingFieldFound = null
            });

            list.AddRange(parser.GetRecords(entityType).Cast<BaseFileEntity>());
        }
    }
    catch (Exception ex)
    {
        if (ex.Data == null || ex.Data.Count == 0)
        {
            errorList.Add(new MasterDataFileParserError
            {
                Error = ex.Message,
                Description = ex.ToString()
            });
        }
        else
        {
            foreach (var key in ex.Data.Keys)
            {
                errorList.Add(new MasterDataFileParserError
                {
                    Error = ex.Message,
                    Description = $"{key}: {ex.Data[key]}"
                });
            }
        }
    }

    errors = errorList;

    return list;
}

Исключение в этой строке: list.AddRange(parser.GetRecords(entityType).Cast<BaseFileEntity>());

Ошибка:

Произошла ошибка при разборе ' xyz.csv-файл для объекта "Test": '[{"Error": "преобразование не может быть выполнено.текст: "rn
Свойством Membertype: Система.Типа int32рн класса typeconverter: 'CsvHelper.TypeConversion.Int32Converter'","Description":"CsvHelper.TypeConversion.TypeConverterException: Преобразование не может быть выполнено.r n текст: "R n MemberType: System. Int32rn TypeConverter: 'CsvHelper.Тип преобразование.Int32Converter'рн по CsvHelper.Конфигурация.Конфигурация.с.Б__148_4(CsvHelperException исключение)rn at CsvHelper.CsvReader.д_ _ 65.MoveNext ()rn at Система.Линк.Перечислимый.d__341.MoveNext()rn at System.Collections.Generic.List1.AddEnumerable (IEnumerable 1 enumerable)rn at System.Collections.Generic.List1.InsertRange (индекс Int32, IEnumerable1 collection)rn at Nec.Stanchion.Business.MasterDataFiles.Handling.MasterDataFileParser.Parse(Stream masterData, Type entityType, IEnumerable1& errors) в xyz.CS файл"}]'.

Причина очень ясна, что пустая или пустая строка несовместима с типом данных int, поэтому должен быть какой-то способ разрешить пустое или нулевое значение со значением столбца типа данных int.

Версия CsvHelper=6.0.0.0

1 3

1 ответ:

Я использую CsvHelper 6.1.0 в моем текущем проекте, просто протестировал вариант использования, подобный вашему, поле int в пустом файле csv, и не было никаких проблем. Вот код, который я использую, надеюсь, это поможет:

        CsvReader csv = new CsvReader(new StreamReader(file.OpenReadStream()));
        csv.Configuration.RegisterClassMap<PessoaCSVMap>();
        csv.Configuration.Delimiter = ";";
        csv.Configuration.HeaderValidated = null;
        csv.Configuration.MissingFieldFound = null;
        List<Pessoas> pessoas = csv.GetRecords<Pessoas>().ToList();

public sealed class PessoaCSVMap : ClassMap<Pessoas>
{
    public PessoaCSVMap()
    {
        Map(m => m.Nome).Name("Nome", "Name");
        ... etc
    }
}