2013-04-30 31 views
0

我需要更改代码以了解数组在txt文件中的维数,我的代码中只能得到2d数组的维数的问题,例如2 * 2,3 * 3 ...但我需要例如3 * 1在txt文件中读取未知数组维度的双数

static double[,] ParseNumberFile(string filename) 
{ 
    // read data from txt file 

    string fileContent = File.ReadAllText(filename); 

    // first put all lines into an string array 
    string[] allLines = fileContent.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); 

    // calculate 2D array's dimension lengths, and initialize the 2Darray 

    int rowCount = allLines.Length; 
    int columnCount = allLines.Length; 

    int i = 0, j = 0; 
    double[,] result = new double[rowCount, columnCount]; 
    foreach (var row in fileContent.Split(new char[] { '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) 
    { 
     j = 0; 
     foreach (var col in row.Trim().Split(' ')) 
     { 
      result[i, j] = double.Parse(col.Trim(), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo); 
      j++; 
     } 
     i++; 
    } 
    return result; 
} 
+0

http://msdn.microsoft.com/en-us/library/2s05feca.aspx – Leri 2013-04-30 11:47:13

+0

注意:有[File.ReadAllLines](http://msdn.microsoft.com /en-us/library/s2tte0y1.aspx) – 2013-04-30 11:53:07

+0

你能否提供一些来自你txt的示例文本? – WiiMaxx 2013-04-30 12:12:08

回答

1

你可以使用泛型列表:

List<List<double>> result = new List<List<double>>(); 
foreach (var row in fileContent.Split(new char[] { '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) 
{ 
    List<double> list = new List<double>() 
    foreach (var col in row.Trim().Split(' ')) 
    { 
     list.Add(double.Parse(col.Trim(), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo)); 
    } 
    result.Add(list); 
} 
+0

+1更容易使用结果。 – 2013-04-30 12:09:15

1

Linq的方式:

 double[][] doubles = File.ReadAllLines("foo.txt"). 
            Where(line => !string.IsNullOrWhiteSpace(line)). 
            Select(line => line.Split(' ').Select(double.Parse).ToArray()). 
            ToArray(); 

为您节省很多代码;)

+0

不编译。 – 2013-04-30 12:00:39

+0

现在应该编译;) – 2013-04-30 12:01:09

+0

是的,虽然不会像OP预期的那样删除空行。 ('.Where(line => line.Trim()!=“”)')(我不确定他为什么会用'\ t'分割文本以找到行(!?)) – 2013-04-30 12:03:47