如何使用Linq将一个制表符分隔的文件读入到多维数组中?

4
对于下面的制表符分隔文件,我正在尝试将其保存在double[][] csvArray中。列数是固定的(5),但行数是动态的。
1,717.72    1,728.89    1,712.61    1,728.89    1,707.11
1,701.19    1,704.11    1,702.05    1,706.98    1,697.19
1,685.41    1,688.68    1,694.07    1,695.71    1,687.20
1,641.05    1,649.27    1,658.06    1,658.58    1,648.09
1,673.69    1,668.34    1,663.90    1,673.42    1,662.16
1,682.32    1,669.54    1,671.33    1,681.02    1,668.81
1,688.12    1,681.44    1,684.90    1,688.57    1,672.60
1,686.02    1,690.76    1,697.13    1,698.13    1,690.35
1,704.92    1,696.22    1,696.74    1,701.17    1,688.74
1,686.78    1,683.61    1,677.03    1,687.88    1,674.40
1,705.94    1,704.90    1,715.58    1,716.91    1,700.25
1,659.22    1,660.46    1,658.69    1,664.98    1,655.62
1,622.31    1,621.94    1,632.78    1,633.61    1,613.91

除了迭代整个矩阵,是否有一些LINQ表达式可以使代码更加简洁易懂?

2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
使用 Linq,您可以这样做:
using System.Globalization;

var csvArray = File
  .ReadLines(@"C:\MyData.csv") // assuming that data is in the file
  .Select(line => line
    .Split('\t')
    .Select(item => Double.Parse(item, CultureInfo.InvariantCulture))
    .ToArray()) 
  .ToArray();
请注意,当使用锯齿状数组(double[][])时,您无需知道确切的列数(在您的情况下为5)。

我想知道您是否能够谈一下使用LINQ与矩阵迭代的效率问题。我自己对LINQ还不是很熟悉。调用两次ToArray()让我觉得我是否做得过多了。 - displayName
1
那段代码非常高效:文件读取(无法避免)是其中最耗时的部分。 - Dmitry Bychenko
你确定它在编译吗?我得到了“不包含'InvariantCulrure'的定义”的错误。 - user829174
1
using System.Globalization; 添加到其他的 using 中。 - Dmitry Bychenko
1
将其作为 double[][] 获取将导致所有数据加载到内存中。考虑使用 IEnumerable(删除 .ToArray() 调用)。 - Ahmed Al Hafoudh
@Ahmed Al Hafoudh:问题说明了csvArray应该是double[][]。你是对的:如果可能不需要实例化(即跳过最后一个ToArray()),就不应该这样做。 - Dmitry Bychenko

0

这将会起作用。

string str = 
  @"1,717.72    1,728.89    1,712.61    1,728.89    1,707.11    
    1,717.72    1,728.89    1,712.61    1,728.89    1,707.11";

var doubles = str
  .Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
  .Select(item => item
    .Split("\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
    .Select(d => double.Parse(d))
    .ToArray())
  .ToArray();

嗯,item.Split(" "... 似乎不正确,而 items.Split('\t')... 就可以了(问题说明使用制表符作为分隔符)。 - Dmitry Bychenko
现在,将抛出异常,因为上面的行中实际上并不是制表符。 - sm.abdullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,