CsvHelper ByteArrayConverter NullValues问题
CsvHelper ByteArrayConverter NullValues problem
我在使用 CsvHelper 将空(值为 "NULL")Key
字段转换为字节数组时遇到了一些问题,我一直收到此异常:
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 ---
映射是这样设置的:
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()}\"!");
}
}
}
}
还有扎兹南 class:
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
列中的值字面上是 NULL
(如包含字母 "NULL" 的字符串)。 ByteArrayconverter 不应该尊重 TypeConverterOptions
吗?
问题是:
- 我是不是做错了什么?
- 我应该自己制作转换器吗?
ByteArrayConverter
似乎没有添加空值逻辑。如果你看StringConverter
, the same null logic is not in the ConvertFromString
method for ByteArrayConverter
。您应该能够创建自己的自定义 TypeConverter
来添加逻辑,然后为所有 byte[]
.
注册它
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);
}
}
csv.Configuration.TypeConverterCache.AddConverter<byte[]>(new NullByteArrayConverter());
我在使用 CsvHelper 将空(值为 "NULL")Key
字段转换为字节数组时遇到了一些问题,我一直收到此异常:
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 ---
映射是这样设置的:
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()}\"!");
}
}
}
}
还有扎兹南 class:
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
列中的值字面上是 NULL
(如包含字母 "NULL" 的字符串)。 ByteArrayconverter 不应该尊重 TypeConverterOptions
吗?
问题是:
- 我是不是做错了什么?
- 我应该自己制作转换器吗?
ByteArrayConverter
似乎没有添加空值逻辑。如果你看StringConverter
, the same null logic is not in the ConvertFromString
method for ByteArrayConverter
。您应该能够创建自己的自定义 TypeConverter
来添加逻辑,然后为所有 byte[]
.
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);
}
}
csv.Configuration.TypeConverterCache.AddConverter<byte[]>(new NullByteArrayConverter());