2017-03-09 60 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

相关问题