如果它们具有相同的标题,如何组合数据表但将列添加在一起? (需要指导或资源)

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” - 您可能需要调整上面的代码以适应您的场景(视为伪代码)

【讨论】:

以上是关于如果它们具有相同的标题,如何组合数据表但将列添加在一起? (需要指导或资源)的主要内容,如果未能解决你的问题,请参考以下文章

将列添加到具有恒定值的数据框

将列中具有相同值的行合并在一起

如何组合具有相同名称的 JSON 对象?

将我的 Access 表导出到 Excel,但将列中的不同值拆分到不同的工作表中

Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来

我希望我的视图控制器具有相同的自定义 UIView 组合,它们可以相互通信