2017-03-09 58 views
0

我已經Json的存儲在數據庫中,我反序列化爲數據表與幫助Newtonsoft.Json這樣如何在單循環中將行和列添加到數據表中?

string jsonString = "[myJsonfromDB....]"; 
//Deserialize to DataTable 
DataTable dtSerialized = (DataTable)JsonConvert.DeserializeObject(jsonString, (typeof(DataTable))); 

這使我產生像這個圖片其他各列未顯示

enter image description here

這裏我標籤是柱和是列值。這兩列都將被移動到新的DataTable中,我將爲我的操作進一步處理。現在我的問題是,我想要在一個循環中執行它,而我在多個循環中執行,即首先添加列(在第一個循環中),然後添加列值(在第二個循環中)。目前我正在做這樣的

string colName = string.Empty; 
// First Loop to add columns 
foreach (DataRow dr in dtSerialized.Rows) 
{ 
    if (!string.IsNullOrEmpty(Utility.Instance.ToString(dr["label"]))) 
    { 
     colName = prefix + "_" + Utility.Instance.ToString(dr["label"]).Replace(" ", string.Empty).Replace("/", "_").Replace("-", "_"); 
     if (!dtResult.Columns.Contains(colName)) 
     dtResult.Columns.Add(colName, typeof(string)); 
    } 
} 

DataRow drSelect = dtResult.NewRow(); 
//Second loop to add column values 
foreach (DataRow dr in dtSerialized.Rows) 
{ 
    if (!string.IsNullOrEmpty(Utility.Instance.ToString(dr["label"]))) 
    { 
     colName = prefix + "_" + Utility.Instance.ToString(dr["label"]).Replace(" ", "").Replace("/", "_").Replace("-", "_"); 
     drSelect[colName] = dr["value"]; 
    } 
} 

dtResult.Rows.Add(drSelect); 
dsResult.Tables.Add(dtResult); 

這之後我已經

enter image description here

一樣多,我知道的是,第一DataRow的架構從數據表中建立再值可以加入清晰在上面的代碼中。現在,我怎樣才能在一個循環?或者我應該搜索替代方法,我不知道如何做到這一點。

在此先感謝

回答

1

我在猜測我在這裏失去了一些東西。這看起來像一個轉置功能,我想不出一種方法來實現這一點,沒有兩個循環或在讀取數據時轉置數據。但是從發佈的內容看來,列label包含新的DataTable的列名。第一列是這個新的DataTable的第一行數據。

如果是這種情況,那麼在通過循環遍歷行以獲得列1(標籤)中的列名稱時,還可以從列0(值)中獲取「值」,並將該值置於List<string>下面命名爲valuesList

你已經完成了所有行循環,並設置列在新DataTabledtResults您可以通過列表設置爲一個字符串數組像下面添加從valuesList單行再經過。這將產生您在一個循環中顯示的第二張照片。我再次猜測,除了這個簡單的轉置之外,還有更多。由於DataTable沒有內置轉置功能,因此您必須自行編寫。不知道你怎麼會在一個循環中做到這一點。希望這可以幫助。

private DataTable Transpose2ColDT(DataTable dtSource) { 
    string prefix = "DIAP_"; 
    string colName = ""; 
    DataTable dtResult = new DataTable(); 
    List<string> valuesList = new List<String>(); 
    if (dtSource.Rows.Count > 0) { 
    foreach (DataRow dr in dtSource.Rows) { 
     if (!dr.IsNull("Label")) { 
     if (dr.ItemArray[1].ToString() != "") { 
      colName = prefix + "_" + dr.ItemArray[1].ToString(); 
      if (!dtResult.Columns.Contains(colName)) { 
      dtResult.Columns.Add(colName, typeof(string)); 
      valuesList.Add(dr.ItemArray[0].ToString()); 
      } 
     } 
     } 
    } 
    dtResult.Rows.Add(valuesList.ToArray<string>()); 
    } // no rows in the original source 
    return dtResult; 
} 
+0

你猜對了@JohnG ..它正在使用一個循環和輕微的變化。謝謝 –

+0

歡迎@ J.SMTBCJ15樂於幫助。 – JohnG

相關問題