C# CSVHelper无法将空浮点值转换为字符串

C# CSVHelper无法将空浮点值转换为字符串,c#,csvhelper,C#,Csvhelper,我有一个csv文件,其中包含整数、字符串、bool和float类型的数据。问题是,有些字段是空的。当我尝试用csvhelper读取csv文件时,我得到TypeConversion.TypeConverterException错误。我检查了详细信息,看起来是因为它无法将空浮点值转换为字符串。我怎么办 namespace Smh { class Program { static void Main(string[] args) {

我有一个csv文件,其中包含整数、字符串、bool和float类型的数据。问题是,有些字段是空的。当我尝试用csvhelper读取csv文件时,我得到TypeConversion.TypeConverterException错误。我检查了详细信息,看起来是因为它无法将空浮点值转换为字符串。我怎么办

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();
}