2017-03-09 3 views
0

Ich habe Json in Datenbank gespeichert, die ich in Datatable deserialisieren mit Hilfe von Newtonsoft.Json wie dieseWie fügt man Zeilen und Spalten zu einer Datentabelle in einer einzelnen Schleife hinzu?

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

Was mir so anderen Spalten in Bild führen gibt nicht

gezeigt

enter image description here

Hier mein Label ist Säule und Wert ist Spaltenwert. Diese beiden Spalten werden in eine neue DataTable verschoben, die ich für meine Operationen weiterverarbeiten werde. Jetzt ist mein Problem, dass ich es in einer Schleife tun möchte, während ich es in mehreren Schleifen mache, d. H. Spalten zuerst hinzufügen (in der ersten Schleife) und dann Spaltenwerte hinzufügen (in der zweiten Schleife). Ich bin es, wie dieses

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); 

Danach Derzeit tun Ich habe

enter image description here

Soviel ich weiß, ist, dass der erste DataRow Schema von Datatable erstellt wird und dann können Werte hinzugefügt werden, was klar ist, im obigen Code. Jetzt, Wie kann ich es in einer Schleife tun? Oder sollte ich nach alternativen Methode suchen, die ich nicht weiß, wie dies zu tun ist.

Vielen Dank im Voraus

Antwort

1

Ich vermute, ich vermisse etwas hier. Das sieht wie eine Transponierfunktion aus und ich kann mir keinen Weg vorstellen, dies ohne zwei Schleifen zu tun oder die Daten beim Einlesen zu transponieren. Aber ausgehend von dem, was gepostet wird, enthält die Spalte label die Spaltennamen der neuen DataTable. Die erste Spalte ist die erste Datenzeile zu diesem neuen DataTable.

Wenn dies der Fall ist, während Sie die Zeilen durchlaufen, um die Spaltennamen aus Spalte 1 (Label) zu erhalten, können Sie auch den "Wert" aus Spalte 0 (Wert) und setzen Sie diesen Wert in eine List<string> benannt valuesList unten.

Dann, nachdem Sie alle Zeilen geschlungen haben durch und legen Sie die Spalten in der neuen DataTabledtResults Sie wie unten eine einzelne Zeile aus der valuesList, indem Sie die Liste in einen String Array hinzufügen können. Dies erzeugt das zweite Bild, das Sie in einer Schleife gezeigt haben. Ich vermute mal, dass es mehr als diese einfache Transponierung gibt. Da eine DataTable keine eingebaute Transponierfunktion hat, müssen Sie Ihre eigene schreiben. Nicht sicher, wie Sie das in einer Schleife tun würden. Hoffe das hilft.

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

Sie haben es richtig geraten @JohnG .. es arbeitet mit einer Schleife und leichte Änderungen. Danke –

+0

Sie sind willkommen @ J.SMTBCJ15 froh zu helfen. – JohnG

Verwandte Themen