首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CsvHelper ByteArrayConverter NullValues问题

CsvHelper ByteArrayConverter NullValues问题
EN

Stack Overflow用户
提问于 2020-02-25 16:27:58
回答 1查看 344关注 0票数 1

在将空(值为"NULL") Key字段转换为具有CsvHelper的字节数组时,我遇到了一些问题,我一直得到以下异常:

代码语言:javascript
复制
CsvHelper.ReaderException: An unexpected error occurred.
---> System.FormatException: Could not find any recognizable digits.
at System.ParseNumbers.StringToInt(ReadOnlySpan`1 s, Int32 radix, Int32 flags, Int32& currPos)
at System.Convert.ToByte(String value, Int32 fromBase)
at CsvHelper.TypeConversion.ByteArrayConverter.HexStringToByteArray(String hex)
at CsvHelper.TypeConversion.ByteArrayConverter.ConvertFromString(String text, IReaderRow row, MemberMapData memberMapData)
at lambda_method(Closure )
at CsvHelper.Expressions.RecordCreator.Create[T]()
at CsvHelper.Expressions.RecordManager.Create[T]()
at CsvHelper.CsvReader.GetRecord[T]()
--- End of inner exception stack trace ---

映射设置如下:

代码语言:javascript
复制
public sealed class ZaznamMapping : ClassMap<Zaznam>
{
    public ZaznamMapping(FileSettings configuration)
    {
        var nullValues = new[] { "NULL", "null", string.Empty };

        for (int i = 0; i < configuration.Count(); i++)
        {
            switch (configuration[i])
            {
                case Col.Ignore: continue;
                case Col.Id:     Map(m => m.Id).Index(i).TypeConverterOption.NullValues(nullValues); break;
                case Col.Idd:    Map(m => m.Idd).Index(i).TypeConverterOption.NullValues(nullValues); break;
                case Col.Data:   Map(m => m.Data).Index(i).TypeConverterOption.NullValues(nullValues); break;
                case Col.Key:    Map(m => m.Key).Index(i).TypeConverterOption.NullValues(nullValues); break;
                default: throw new NotSupportedException($"Mapping() - Unknown column \"{configuration[i].ToString()}\"!");
            }
        }
    }
}

和Zaznam班级:

代码语言:javascript
复制
public sealed class Zaznam
{
    public int Id { get; set; }
    public int Idd { get; set; }
    public byte[] Data { get; set; }
    public byte[] Key { get; set; }
}

文件Key coluimn中的值实际上是NULL (在包含字母“NULL”的字符串中)。ByteArrayconverter不应该尊重TypeConverterOptions吗?

问题是:

  • Am我在做wrong?
  • Should我在做我自己的转换器instead?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-25 20:31:14

看起来空值逻辑没有添加到ByteArrayConverter中。如果您查看StringConverter,相同的空逻辑不在ByteArrayConverterConvertFromString方法中。您应该能够创建自己的自定义TypeConverter来添加逻辑,然后将其注册为所有byte[]

代码语言:javascript
复制
public class NullByteArrayConverter : ByteArrayConverter
{
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        foreach (var nullValue in memberMapData.TypeConverterOptions.NullValues)
        {
            if (text == nullValue)
            {
                return null;
            }
        }

        return base.ConvertFromString(text, row, memberMapData);
    }
}
代码语言:javascript
复制
csv.Configuration.TypeConverterCache.AddConverter<byte[]>(new NullByteArrayConverter());
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60399169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档