2015-09-04 47 views
4

對於以下製表符分隔的文件,我想將它保存在double[][] csvArray如何使用Linq將製表符分隔的文件讀入多維數組?

的cols的數量是最終的(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表達式,可以除了迭代整個矩陣之外,還可以獲得這個很好的和乾淨的?

回答

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你的情況)

+0

我想知道是否可以說一些關於使用此LINQ與矩陣迭代的效率的問題。我是LINQ自己的新手。對ToArray()進行兩次調用讓我覺得如果我過於執着。 – displayName

+1

該代碼*效率很高*:文件閱讀(你無法避免)是最令人費解的部分。 –

+0

你確定它正在編譯?我得到'不包含'InvariantCulrure'的定義' – user829174

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(); 
+0

呃,'item.Split(「」...'似乎是不正確的,'items.Split('\ t')...'會做(問題表明*製表*被用作派生者) –

+0

固定..現在,將拋出異常爲「」不是真正的選項卡上方的行 –

相關問題