【问题标题】:Reading from .csv-file into double-array从 .csv 文件读取到双数组
【发布时间】:2017-04-04 08:58:33
【问题描述】:

我有一个关于 LINQ 查询和返回类型的问题。我只想从 .csv 文件中读取值,其中有用分号分隔的双精度值,如下所示:

0,016;0,010;-0,020;-0,014;0,020;0,016;-0,019;-0,014;0,023;

使用以下语句从文件中读取可以正常工作:

        double pdValue;
        double[] pdValues;

        var values = File.ReadAllLines(path)
            .Select(a => a.Split(';')
            .Select(str => double.TryParse(str, out pdValue) ? pdValue : 0));

        pdValues = values.ToArray();

但最后一行返回“无法将 System.Collections.Generic.IENumerable 隐式转换为 double[]”错误。尝试让它与数组一起使用会将错误更改为“无法将 System.Collections.Generic.IENumerable[] 隐式转换为 double[]”。

在调试时,我已经可以看到 values 变量将文件中的所有值(以某种方式)保存为数组...

我还没有找到任何东西,有什么可以提示我在这里到底做错了什么。有人可以帮帮我吗?

提前致谢!

【问题讨论】:

  • 好吧,你说 values 变量将文件中的所有值(以某种方式)保存为数组。错误因为你说 a.Split(';') ..所以现在它是一个字符串数组.. .
  • 使用File.ReadLines 代替File.ReadAllLines 更有用,因为File.ReadLines 流式传输数据而不是将其全部加载到内存中。
  • 文件包含多行?所以这将是double[][] 结果你需要什么? double[][]double[] (所有行合并)

标签: c# arrays linq csv


【解决方案1】:

查看values 变量类型,即IEnumerable<IEnumerable<double>>。您应该使用以下代码:

 var values = File.ReadAllLines(path)
            .SelectMany(a => a.Split(';')
            .Select(str => double.TryParse(str, out pdValue) ? pdValue : 0));

pdValues = values.ToArray();

【讨论】:

  • 非常感谢,.SelectMany 语句修复了它!
【解决方案2】:

ReadAllLine 方法将返回一个字符串数组(比如说数组 A)。您使用的Split 方法将为您提供一个由“;”分割的字符串数组对于数组 A 的每个项目。所以最终结果将是一个数组数组。这就是错误的原因。

你可以试试:

var values = File.ReadAllLines(path).ToString()
            .Split(';').Select(str => double.TryParse(str, out pdValue) ? pdValue : 0);

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2014-02-01
    • 2017-09-14
    • 2012-10-20
    相关资源
    最近更新 更多