2017-05-04 38 views
0

我想读取一个数据表,其中包含将每行不同列组成的数据表。将具有不同列的数据表读入C中的数组#

我的样本数据看起来像这样

1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.098 0.000 
1 0.000 0.051 0.851 0.000 0.000 0.000 0.000   
1 0.000 0.000 0.000 0.000 0.000 0.000 0.266 0.203 0.000 
1 0.011 0.210 0.311 0.000 0.000 0.000 0.000 0.000 0.000 
1 0.000 0.000 0.000 0.000 0.000 0.009 0.007 0.497  
1 0.004 0.023 0.063 0.140 0.000 0.000 0.000 0.000 0.000 
1 0.027 0.010 0.130 0.192 0.156 0.082 0.068 

我设法把它放到一个数组,如下所示:

public static double[][] dataTableToMatrix(DataTable dt) 
    { 
     double[][] data = new double[dt.Rows.Count][]; 

     for (int x = 0; x < dt.Rows.Count;x++) 
     { 
      data[x] = new double[dt.Columns.Count]; 

      for (int y = 0; y < dt.Columns.Count; y++) 
      { 
       if ((dt.Rows[x][y]) != DBNull.Value) 
       { 
        data[x][y] = Convert.ToDouble(dt.Rows[x][y]); 
       } 
       else 
       { 
        break; 
       } 
      } 
     } 
     return data; 

    } 

我试图上面的代码,但所得的阵列具有总是最高柱每当有一个较短的列时,计数为零。我想读取它,直到每行中的最后一个值跳到下一行。任何解决这个问题的方法?

+1

甚至有可能创造一个具有不同行长度的表格?你不确定你误解行长与值为空吗? – Gusman

+0

DataTables不支持可变长度的行。这些列在模式级别定义,非常类似于数据库表。这些空白很可能是空值,您确实在循环中处理这些空值。 –

回答

0

如果我的理解对不对您的问题,这将做你想要的(而不是预先分配的子阵列只使用列表,然后将它们转换为数组):

public static double[][] dataTableToMatrix(DataTable dt) 
{ 
    double[][] data = new double[dt.Rows.Count][]; 

    for (int x = 0; x < dt.Rows.Count;x++) 
    { 
     List<double> items = new List<double>(); 

     for (int y = 0; y < dt.Columns.Count; y++) 
     { 
      if (dt.Rows[x][y] != DBNull.Value) 
       items.Add(Convert.ToDouble(dt.Rows[x][y])); 
      else 
       break; 
     } 

     data[x] = items.ToArray(); 

    } 

    return data; 

} 
+0

令人惊叹!这工作非常好!你能简单解释一下为什么它和列表一起工作? – MarKS

+1

简单来说,你的数组是用表的行大小创建的,一个表在每一行上都有相同的列数,所以你所有的数组总是大小为表列数。 List是一个可变大小的集合,代码添加元素直到它在列上找到空值,然后将List与精确元素转换为数组。 – Gusman

+0

正如我在你的问题上指出的评论,你误解有一个空值,就好像该行不存在,这是完全错误的,该列始终存在于每一行,但它可能有一个空价值,这与不存在完全不同。 – Gusman

-1
public static double[][] dataTableToMatrix(DataTable dt) 
{ 
    double[][] data = new double[dt.Rows.Count][]; 

    for (int x = 0; x < dt.Rows.Count;x++) 
    { 
     var countOfNonNullValuesInRow = dt.Rows[x].ItemArray.Count(a => a != DBNull.Value); 
     data[x] = new double[countOfNonNullValuesInRow]; 

     for (int y = 0; y < countOfNonNullValuesInRow; y++) 
     { 
      data[x][y] = Convert.ToDouble(dt.Rows[x][y]); 
     } 
    } 
    return data; 
} 
相关问题