Проверьте, подходит ли вам приведенный ниже код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//create input data
DataTable dt1 = new DataTable();
dt1.Columns.Add("Matricule", typeof(int));
for (int i = 1; i <= 31; i++)
{
dt1.Columns.Add(i.ToString(), typeof(string));
dt1.Columns[i.ToString()].AllowDBNull = true;
}
dt1.Rows.Add(new object[] { 177, null, "AP", null, null, null, null, "AP" });
dt1.Rows.Add(new object[] { 178, null, "AC", null, null, null, null, null, "AC" });
dt1.Rows.Add(new object[] { 198, null, "AM", null, null, null, "AM" });
dt1.Rows.Add(new object[] { 122, null, "AD", null, null, null, null, null, null, "AD" });
dt1.Rows.Add(new object[] { 167, null, "AF", null, null, null, null, "AF" });
dt1.Rows.Add(new object[] { 199, null, "AS", null, null, null, null, null, "AS" });
DataTable dt2 = new DataTable();
dt2.Columns.Add("Matricule", typeof(int));
dt2.Columns.Add("Day", typeof(int));
dt2.Columns.Add("Name", typeof(string));
foreach(DataRow row in dt1.AsEnumerable())
{
object[] rowData1 = row.ItemArray;
for (int col = 1; col < rowData1.Length - 1; col++)//do not include last column
{
if (rowData1[col] != DBNull.Value)
{
DataRow rowData2 = dt2.Rows.Add();
rowData2["Matricule"] = rowData1[0];
rowData2["Day"] = col.ToString();
rowData2["Name"] = rowData1[col];
}
}
}
DataTable dt3 = new DataTable();
var groups = dt2.AsEnumerable().GroupBy(x => x.Field<int>("Matricule")).ToList();
dt3.Columns.Add("Matricule", typeof(int));
for (int i = 1; i <= 31; i++)
{
dt3.Columns.Add(i.ToString(), typeof(string));
dt3.Columns[i.ToString()].AllowDBNull = true;
}
foreach (var group in groups)
{
DataRow newRow = dt3.Rows.Add();
newRow["Matricule"] = group.Key;
foreach (DataRow row in group)
{
newRow[row.Field<int>("Day")] = row.Field<string>("Name");
}
}
}
}
}
См. Изображение ниже:
