2017-05-04 37 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; 
} 
相關問題