如何处理使用 CsvHelper 解析时的空列?
How to handle empty column in parsing with CsvHelper?
我有一个 CSV 文件,我正在尝试解析它,但是在 int 数据类型 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>());
错误:
An error has occurred while parsing 'xyz.csv' file for 'Test' entity:
'[{"Error":"The conversion cannot be performed.\r\n Text: ''\r\n
MemberType: System.Int32\r\n TypeConverter:
'CsvHelper.TypeConversion.Int32Converter'","Description":"CsvHelper.TypeConversion.TypeConverterException:
The conversion cannot be performed.\r\n Text: ''\r\n MemberType:
System.Int32\r\n TypeConverter:
'CsvHelper.TypeConversion.Int32Converter'\r\n at
CsvHelper.Configuration.Configuration.<>c.<.ctor>b__148_4(CsvHelperException
exception)\r\n at
CsvHelper.CsvReader.d__65.MoveNext()\r\n at
System.Linq.Enumerable.d__341.MoveNext()\r\n at
System.Collections.Generic.List
1.AddEnumerable(IEnumerable1
enumerable)\r\n at
System.Collections.Generic.List
1.InsertRange(Int32 index,
IEnumerable1 collection)\r\n at
Nec.Stanchion.Business.MasterDataFiles.Handling.MasterDataFileParser.Parse(Stream
masterData, Type entityType, IEnumerable
1& errors) in xyz.cs
file"}]'.
原因很清楚,空白或空字符串与 int
数据类型不兼容,因此必须有一些方法允许空值或空值与 int
数据类型列值。
CsvHelper 版本=6.0.0.0
我在当前项目中使用的是 CsvHelper 6.1.0,刚刚测试了一个与您类似的用例,csv 文件中的 int 字段为空白,没有问题。这是我正在使用的代码,希望对您有所帮助:
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
}
}
我也有这个问题,空值/其他有问题的值在 double 或 decimal 对象中不被排除
我找到的最佳解决方案是这样的:
//first inject the class map
CsvReader csv = new CsvReader(new
StreamReader(file.OpenReadStream()));
csv.Configuration.RegisterClassMap<SomeEntityClassMap>();
var records = csv.GetRecords<SomeEntity>().ToList();
public class SomeEntityClassMap : ClassMap<SomeEntity>
{
public SomeEntityClassMap()
{
//use the converter on double or decimal types
Map(x => x.Price).TypeConverter<DoubleConverter>();
Map(x => x.Cost).TypeConverter<DoubleConverter>();
}
}
public class DoubleConverter : DefaultTypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
if(double.TryParse(text, out var result))
return result;
return 0;
}
}
我有一个 CSV 文件,我正在尝试解析它,但是在 int 数据类型 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>());
错误:
An error has occurred while parsing 'xyz.csv' file for 'Test' entity: '[{"Error":"The conversion cannot be performed.\r\n Text: ''\r\n
MemberType: System.Int32\r\n TypeConverter: 'CsvHelper.TypeConversion.Int32Converter'","Description":"CsvHelper.TypeConversion.TypeConverterException: The conversion cannot be performed.\r\n Text: ''\r\n MemberType: System.Int32\r\n TypeConverter: 'CsvHelper.TypeConversion.Int32Converter'\r\n at CsvHelper.Configuration.Configuration.<>c.<.ctor>b__148_4(CsvHelperException exception)\r\n at CsvHelper.CsvReader.d__65.MoveNext()\r\n at System.Linq.Enumerable.d__341.MoveNext()\r\n at System.Collections.Generic.List
1.AddEnumerable(IEnumerable1 enumerable)\r\n at System.Collections.Generic.List
1.InsertRange(Int32 index, IEnumerable1 collection)\r\n at Nec.Stanchion.Business.MasterDataFiles.Handling.MasterDataFileParser.Parse(Stream masterData, Type entityType, IEnumerable
1& errors) in xyz.cs file"}]'.
原因很清楚,空白或空字符串与 int
数据类型不兼容,因此必须有一些方法允许空值或空值与 int
数据类型列值。
CsvHelper 版本=6.0.0.0
我在当前项目中使用的是 CsvHelper 6.1.0,刚刚测试了一个与您类似的用例,csv 文件中的 int 字段为空白,没有问题。这是我正在使用的代码,希望对您有所帮助:
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
}
}
我也有这个问题,空值/其他有问题的值在 double 或 decimal 对象中不被排除
我找到的最佳解决方案是这样的:
//first inject the class map
CsvReader csv = new CsvReader(new
StreamReader(file.OpenReadStream()));
csv.Configuration.RegisterClassMap<SomeEntityClassMap>();
var records = csv.GetRecords<SomeEntity>().ToList();
public class SomeEntityClassMap : ClassMap<SomeEntity>
{
public SomeEntityClassMap()
{
//use the converter on double or decimal types
Map(x => x.Price).TypeConverter<DoubleConverter>();
Map(x => x.Cost).TypeConverter<DoubleConverter>();
}
}
public class DoubleConverter : DefaultTypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
if(double.TryParse(text, out var result))
return result;
return 0;
}
}