C# CSVHelper无法将空浮点值转换为字符串
我有一个csv文件,其中包含整数、字符串、bool和float类型的数据。问题是,有些字段是空的。当我尝试用csvhelper读取csv文件时,我得到TypeConversion.TypeConverterException错误。我检查了详细信息,看起来是因为它无法将空浮点值转换为字符串。我怎么办C# CSVHelper无法将空浮点值转换为字符串,c#,csvhelper,C#,Csvhelper,我有一个csv文件,其中包含整数、字符串、bool和float类型的数据。问题是,有些字段是空的。当我尝试用csvhelper读取csv文件时,我得到TypeConversion.TypeConverterException错误。我检查了详细信息,看起来是因为它无法将空浮点值转换为字符串。我怎么办 namespace Smh { class Program { static void Main(string[] args) {
namespace Smh
{
class Program
{
static void Main(string[] args)
{
List<E> EList = new List<E>();
List<E2> EList2 = new List<E2>();
string filePath = @"D:\Visual Studio\Projects\Example\boo.csv";
using (var reader = new StreamReader(filePath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var example= new E();
EList= csv.GetRecords<E>().ToList();
}
.
.
.
我得到的错误是:
csv文件的一小部分:
id | speed | type | weight
1 40 type1 5.4
2 43 type2
3 16 type3 5.2
最简单的解决方案是使用
ClassMap
自定义映射器,
是否将类型更改为浮动?
public class Test{
public int id{get;set;}
public int speed{get;set;}
public string type{get;set;}
public float? weight{get;set;}
}
然后,如果需要更改默认值,可以添加一个Getter Setter,它将返回Single.NaN
例如:
publicstaticvoidmain()
{
var result=新列表();
使用(var stream=new MemoryStream())
使用(var writer=新的StreamWriter(流))
使用(变量读取器=新的流读取器(流))
使用(var csv=new CsvReader(reader,CultureInfo.InvariantCulture))
{
//Csv创建
writer.WriteLine(“id、速度、类型、重量”);
writer.WriteLine(“1,40,type1,5.4”);
writer.WriteLine(“2,43,type2,”);
writer.WriteLine(“3,16,type3,5.2”);
writer.Flush();
流位置=0;
csv.Configuration.HasHeaderRecord=true;
csv.Configuration.Delimiter=“,”;
结果=csv.GetRecords().ToList();
}
result.Dump();
}
最简单的解决方案,无需使用ClassMap
自定义映射器,
是否将类型更改为浮动?
public class Test{
public int id{get;set;}
public int speed{get;set;}
public string type{get;set;}
public float? weight{get;set;}
}
然后,如果需要更改默认值,可以添加一个Getter Setter,它将返回Single.NaN
例如:
publicstaticvoidmain()
{
var result=新列表();
使用(var stream=new MemoryStream())
使用(var writer=新的StreamWriter(流))
使用(变量读取器=新的流读取器(流))
使用(var csv=new CsvReader(reader,CultureInfo.InvariantCulture))
{
//Csv创建
writer.WriteLine(“id、速度、类型、重量”);
writer.WriteLine(“1,40,type1,5.4”);
writer.WriteLine(“2,43,type2,”);
writer.WriteLine(“3,16,type3,5.2”);
writer.Flush();
流位置=0;
csv.Configuration.HasHeaderRecord=true;
csv.Configuration.Delimiter=“,”;
结果=csv.GetRecords().ToList();
}
result.Dump();
}
您希望值是什么?NaN,无穷大,0.0?建议:将weight
设置为字符串,并以执行浮点解析的方式实现setter。我认为“NaN”将是最好的解决方案。您所说的“实现setter的方式使其能够进行浮点解析”是什么意思?我们可以有一个简单的Csv,有1列或2列,最多5行。使用所述类表示和映射器信息。用最少的示例编辑问题。关键是,“权重”有一个不包含任何内容的字段。(Ofc它在实际文件中有更多)错误值是null
,这意味着weight
应该是float?
。您希望该值是什么?NaN,无穷大,0.0?建议:将weight
设置为字符串,并以执行浮点解析的方式实现setter。我认为“NaN”将是最好的解决方案。您所说的“实现setter的方式使其能够进行浮点解析”是什么意思?我们可以有一个简单的Csv,有1列或2列,最多5行。使用所述类表示和映射器信息。用最少的示例编辑问题。关键是,“权重”有一个不包含任何内容的字段。(Ofc它在实际文件中有更多)错误值是null
,这意味着weight
应该是float?
。它解决了问题,但遇到了另一个问题。看起来它也不能处理空的int值。是否可以像public int那样执行相同的操作?是的,你也可以这样做。它解决了问题,但遇到了另一个问题。看起来它也不能处理空的int值。是否可以像public int那样执行相同的操作?有些东西
?是的,你也可以这样做。
public static void Main()
{
var result = new List<Test>();
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
//Csv Creation
writer.WriteLine("id,speed,type,weight");
writer.WriteLine("1,40,type1,5.4");
writer.WriteLine("2,43,type2,");
writer.WriteLine("3,16,type3,5.2");
writer.Flush();
stream.Position = 0;
csv.Configuration.HasHeaderRecord = true;
csv.Configuration.Delimiter = ",";
result = csv.GetRecords<Test>().ToList();
}
result.Dump();
}