如果它们具有相同的标题,如何组合数据表但将列添加在一起? (需要指导或资源)
Posted
技术标签:
【中文标题】如果它们具有相同的标题,如何组合数据表但将列添加在一起? (需要指导或资源)【英文标题】:How to combine Datatables but add columns together if they have the same header? (need guidance or resources) 【发布时间】:2021-06-08 20:22:28 【问题描述】:我在使用数据表方面是全新的。 我正在尝试获取两个数据表并将它们组合起来,如果这两个表的列具有匹配的标题,则将这些列中的数据一起添加到一个新列中。
另一个问题是标题是动态创建的,所以我永远不知道标题的名称是什么。
数据表 1:
TeamName | Date1 | Date2 |
---|---|---|
First | int value | int value |
Second | int value | int value |
数据表 2:
TeamName | Date2 | Date3 |
---|---|---|
First | int value | int value |
Second | int value | int value |
新表:
TeamName | Date1 | Date2 | Date3 |
---|---|---|---|
First | int value | int value1 + int value2 | int value |
Second | int value | int value1 + int value2 | int value |
如果有人对如何开始使用 C# 和/或 LINQ 进行此操作有任何见解,我将不胜感激。
我有一些代码,但它只是通过包含所有内容来组合表格,它基本上看起来就像两个表格并排,没有混合在一起。
DataTable targetTable = dt1.Clone();
var dt2Columns = dt2.Columns.OfType<DataColumn>().Select(dc =>
new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
where targetTable.Columns.Contains(dc.ColumnName) == false
select dc;
targetTable.Columns.AddRange(dt2FinalColumns.ToArray());
var rowData = from row1 in dt1.AsEnumerable()
join row2 in dt2.AsEnumerable()
on row1.Field<string>("ScrumTeam") equals row2.Field<string>("ScrumTeam")
select row1.ItemArray.Concat(row2.ItemArray.Where(r2 => row1.ItemArray.Contains(r2) == false)).ToArray();
foreach (object[] values in rowData)
targetTable.Rows.Add(values);
【问题讨论】:
你能得到数据表的源数据吗?可能会容易得多。 @GertArnold 很遗憾我不能 【参考方案1】:不确定 LINQ 是否让您的生活更轻松
//ensure the dt2 column exists in dt1
foreach(DataColumn dc2 in dt2.Columns)
if(!dt1.Columns.Contains(dc2.ColumnName))
dt1.Columns.Add(dc2.Name, dc2.DataType);
//index the rows
var d = dt1.Rows.Cast<DataRow>().ToDictionary(r => r["TeamName"]);
//merge the tables, dt2 into dt1
foreach(DataRow r2 in dt2)
DataRow r1;
//handle dt2 team name absence from dt1
if(!d.ContainsKey(r2["TeamName"]))
d[r2["TeamName"]] = r1 = dt.NewRow();
dt1.AddRow(r1);
//index now surely contains r1; get it
r1 = d[r2["TeamName"]];
//merge data from 2 into 1
foreach(DataColumn dc2 in dt2.Columns)
//skip the PK
if(dc2.ColumnName == "TeamName")
continue;
//all the values seem to be int. if not true add some "if type is..." handling here
r1[dc2.ColumnName] = (int)r1[dc2.ColumnName] + (int)r2[dc2.ColumnName];
您的代码显示“ScrumTeam”,但问题表显示“TeamName” - 您可能需要调整上面的代码以适应您的场景(视为伪代码)
【讨论】:
以上是关于如果它们具有相同的标题,如何组合数据表但将列添加在一起? (需要指导或资源)的主要内容,如果未能解决你的问题,请参考以下文章
将我的 Access 表导出到 Excel,但将列中的不同值拆分到不同的工作表中
Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来