【问题标题】:CsvHelper cannot read double valuesCsvHelper 无法读取双精度值
【发布时间】:2019-09-09 16:23:16
【问题描述】:

我有这段代码可以使用 CsvHelper 库读取一个简单的 CSV 文件

public class CSVData
    {
        public string Time { get; set; }
        public double Value1 { get; set; }
        public double Value2 { get; set; }
        public double Value3 { get; set; }
    }

using (var reader = new StreamReader("c:\\temp\\test.csv"))
using (var csv = new CsvReader(reader))
{
   var records = csv.GetRecords<CSVData>();
}

这就是 CSV 数据的样子

"Time","Value1","Value2","Value3"
 8/28/2019 4:32:09 PM,2.03,10229.73,10437.51821998

当我尝试使用

读取记录时出现此错误
 foreach (CSVData item in records)

CsvHelper.BadDataException: 'You can ignore bad data by setting BadDataFound to null.'

【问题讨论】:

  • 我添加了“Value3”,后面加了逗号,但我得到了同样的错误
  • 您还测试了哪些其他值?你确定它是第一个值而不是双打中的一个吗?如果删除双精度值怎么办?您是否尝试引用包含值?您需要自己进行更多故障排除,以准确找出导致问题的值或值组合或格式。
  • 您在尝试读取时遇到了错误,哪条记录?如果您在失败的区域设置断点,那么您尝试读取的具体 CSVData 记录是什么解析?
  • 我删除了第一列,我得到了同样的错误
  • @gravity 错误出现在所有记录中,我无法读取任何内容

标签: c# .net csvhelper


【解决方案1】:

只要您将美国文化设置用于双精度(使用 . 小数点),您的代码实际上对我来说工作得很好。

class Program
{
    static void Main(string[] args)
    {

        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);

        List<CSVData> records;

        using (var reader = new StreamReader("test.csv"))
        using (var csv = new CsvReader(reader))
        {
            records = csv.GetRecords<CSVData>().ToList();
        }

        foreach (var r in records)
        {
            Console.WriteLine($"Time:{r.Time} Value1:{r.Value1} Value2:{r.Value2} Value3:{r.Value3}");
        }
    }
}

这个输出:

Time: 8/28/2019 4:32:09 PM Value1:2.03 Value2:10229.73 Value3:10437.51821998

【讨论】:

  • 我们可能有不同的语言环境?双重格式?
  • 如果您使用 double.ToString() 从您的代码中打印一个 double 会是什么样子?您是否使用 , 作为小数点?
  • 如何为 CsvHelper 指定语言环境?
  • 我的语言环境是逗号分隔符,而不是点
  • Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
【解决方案2】:

尝试在配置中设置文化信息。您可能还需要设置分隔符。

using (var reader = new StreamReader("c:\\temp\\test.csv"))
using (var csv = new CsvReader(reader))
{
    csv.Configuration.CultureInfo = new CultureInfo("en-US", false);

    csv.Configuration.Delimiter = ",";

    var records = csv.GetRecords<CSVData>();
}

【讨论】:

  • 谢谢!但看起来双数字的区域设置格式是问题
  • 明白了。也可以在配置中设置CultureInfo
  • 谢谢!我不知道怎么做,我是 CsvHelper 的新手
  • 在玩过其他 CultureInfo 之后。如果您的 CurrentCulture 使用的不是逗号,您可能还需要设置分隔符。
【解决方案3】:

您可以尝试将 CultureInfo 设置为 CurrentCulture。

csv.Configuration.CultureInfo = CultureInfo.CurrentCulture;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2013-07-25
    • 2023-03-13
    • 2016-10-21
    相关资源
    最近更新 更多