【问题标题】:CSVHelper cannot convert empty float values to stringCSVHelper 无法将空浮点值转换为字符串
【发布时间】:2020-10-14 07:33:06
【问题描述】:

我有一个 csv 文件,其中包含整数、字符串、布尔和浮点类型的数据。问题是,有些字段是空的。当我尝试使用 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();
            }
.
.
.

我的“E”类的一部分:

.
.
 public float weight { get; set; }
.
.

我得到的错误是: https://i.postimg.cc/dVPkYDCm/image.png

csv 文件的一小部分:

id | speed | type | weight
1     40     type1   5.4
2     43     type2
3     16     type3   5.2 

【问题讨论】:

  • 你想要的值是什么? NaN,无穷大,0.0?建议:将weight 设为字符串并以执行浮点解析的方式实现setter。
  • 我认为“NaN”是最好的解决方案。 “以执行浮点解析的方式实现设置器”是什么意思?
  • 愿我们有一个minimal reproducible example,一个简单的 1 或 2 列和最多 5 行的 Csv。用所说的Class表示和映射器信息。
  • 用一个最小的例子编辑了这个问题。关键是,“重量”有一个不包含任何内容的字段。 (Ofc 它在真实文件中有更多内容)
  • 缺失值是null,这意味着weight 应该是float?

标签: c# csvhelper


【解决方案1】:

不使用 ClassMap 自定义映射器的最简单解决方案, 就是把类型改成float?

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

示例: Live Demo

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

【讨论】:

  • 它解决了问题,但遇到了另一个问题。看起来它也无法处理空的 int 值。是否可以像public int? something 一样做同样的事情?
  • 是的,你也可以这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
相关资源
最近更新 更多