首页 > 其他分享 >多个DataTable的合并成一个新表

多个DataTable的合并成一个新表

时间:2023-04-21 11:01:39浏览次数:32  
标签:Rows DataTable2 DataTable1 newDataTable 合并 Add 新表 DataTable

https://www.cnblogs.com/JuneZhang/archive/2011/12/11/2284243.html

有时我们知道了两个DataTable1和DataTable2,我们希望将它们合并为一个新的DataTable(下面的例子中命名为了newDataTable),这就分为两种情况:DataTable1和DataTable2结构相同、DataTable1和DataTable2结构不同,下面分别介绍怎么进行合并。

一、DataTable1和DataTable2结构相同的情况,结构相同我们只需要把两者的数据罗列到一块就可以了

首先初始化相同结构DataTable(测试用的)

复制代码
        void InitDataTable1(DataTable dt)
{
dt.Columns.Add("student_no");
dt.Columns.Add("student_name");
dt.Rows.Add("001", "June");
dt.Rows.Add("002", "zhang");
dt.Rows.Add("003", "jun");
}
void InitDataTable2(DataTable dt)
{
dt.Columns.Add("student_no");
dt.Columns.Add("student_name");
dt.Rows.Add("111", "ABC");
dt.Rows.Add("222", "XYZ");
dt.Rows.Add("333", "OPQ");
}
复制代码

合并方法1:用Rows.Add方法

复制代码
            DataTable newDataTable = DataTable1.Clone();

object[] obj = new object[newDataTable.Columns.Count];
//添加DataTable1的数据
for (int i = 0; i < DataTable1.Rows.Count; i++)
{
DataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
newDataTable.Rows.Add(obj);
}
//添加DataTable2的数据
for (int i = 0; i < DataTable2.Rows.Count; i++)
{
DataTable2.Rows[i].ItemArray.CopyTo(obj, 0);
newDataTable.Rows.Add(obj);
}
复制代码

合并方法2:用DataTable.ImportRow方法

复制代码
            //拷贝DataTable1的结构和数据
DataTable newDataTable = DataTable1.Copy();
//添加DataTable2的数据
foreach (DataRow dr in DataTable2.Rows)
{
newDataTable.ImportRow(dr);
}
复制代码

其实添加DataTable1的结构和数据有两种方法

复制代码
            //克隆DataTable1的结构
DataTable newDataTable = DataTable1.Clone();

object[] obj = new object[newDataTable.Columns.Count];
//添加DataTable1的数据
for (int i = 0; i < DataTable1.Rows.Count; i++)
{
DataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
newDataTable.Rows.Add(obj);
}
复制代码

或者直接用自带的Copy方法  DataTable newDataTable = DataTable1.Copy();
二、DataTable1和DataTable2结构不同相同的情况,我们可以先向新表中添加DataTable1的数据,然后再向每行的后面添加添加DataTable2的数据,注意两者的行数不一定相同。

 首先初始化相同结构DataTable(测试用的)

复制代码
        void InitDataTable1(DataTable dt)
{
dt.Columns.Add("student_no1");
dt.Columns.Add("student_name1");
dt.Rows.Add("001", "June");
dt.Rows.Add("002", "zhang");
//dt.Rows.Add("003", "jun");
}
void InitDataTable2(DataTable dt)
{
dt.Columns.Add("student_no2");
dt.Columns.Add("student_name2");
dt.Rows.Add("111", "ABC");
dt.Rows.Add("222", "XYZ");
dt.Rows.Add("222", "ASD");
}
复制代码

方法(1)先添加第一个表,再添加第二个表

复制代码
        /// <summary> 
/// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable
/// </summary>
/// <param name="DataTable1">表1</param>
/// <param name="DataTable2">表2</param>
/// <param name="DTName">合并后新的表名</param>
/// <returns>合并后的新表</returns>
private DataTable UniteDataTable(DataTable DataTable1, DataTable DataTable2, string DTName)
{
//克隆DataTable1的结构
DataTable newDataTable = DataTable1.Clone();
for (int i = 0; i < DataTable2.Columns.Count; i++)
{
//再向新表中加入DataTable2的列结构
newDataTable.Columns.Add(DataTable2.Columns[i].ColumnName);
}
object[] obj = new object[newDataTable.Columns.Count];
//添加DataTable1的数据
for (int i = 0; i < DataTable1.Rows.Count; i++)
{
DataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
newDataTable.Rows.Add(obj);
}

if (DataTable1.Rows.Count >= DataTable2.Rows.Count)
{
for (int i = 0; i < DataTable2.Rows.Count; i++)
{
for (int j = 0; j < DataTable2.Columns.Count; j++)
{
newDataTable.Rows[i][j + DataTable1.Columns.Count] = DataTable2.Rows[i][j].ToString();
}
}
}
else
{
DataRow dr3;
//向新表中添加多出的几行
for (int i = 0; i < DataTable2.Rows.Count - DataTable1.Rows.Count; i++)
{
dr3 = newDataTable.NewRow();
newDataTable.Rows.Add(dr3);
}
for (int i = 0; i < DataTable2.Rows.Count; i++)
{
for (int j = 0; j < DataTable2.Columns.Count; j++)
{
newDataTable.Rows[i][j + DataTable1.Columns.Count] = DataTable2.Rows[i][j].ToString();
}
}
}
newDataTable.TableName = DTName; //设置DT的名字
return newDataTable;
复制代码

方法(2)先添加行数多的表。其实我们也可以先判断哪个表的行数多,就先添加哪个表,然后再添加行少的表就可以了。

复制代码
        /// <summary> 
/// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable
/// </summary>
/// <param name="DataTable1">表1</param>
/// <param name="DataTable2">表2</param>
/// <param name="DTName">合并后新的表名</param>
/// <returns>合并后的新表</returns>
private DataTable UniteDataTable2(DataTable DataTable1, DataTable DataTable2, string DTName)
{
DataTable newDataTable = new DataTable();
if (DataTable1.Rows.Count > DataTable2.Rows.Count)
{
newDataTable = FillData(DataTable1, DataTable2);
}
else
{
newDataTable = FillData(DataTable2, DataTable1);
}

newDataTable.TableName = DTName; //设置DT的名字
return newDataTable;
}

private DataTable FillData(DataTable dt1, DataTable dt2)
{
//克隆DataTable1的结构
DataTable newDataTable = dt1.Clone();
for (int i = 0; i < dt2.Columns.Count; i++)
{
//再向新表中加入DataTable2的列结构
newDataTable.Columns.Add(dt2.Columns[i].ColumnName);
}
object[] obj = new object[newDataTable.Columns.Count];
//添加DataTable1的数据
for (int i = 0; i < dt1.Rows.Count; i++)
{
dt1.Rows[i].ItemArray.CopyTo(obj, 0);
newDataTable.Rows.Add(obj);
}
for (int i = 0; i < dt2.Rows.Count; i++)
{
for (int j = 0; j < dt2.Columns.Count; j++)
{
newDataTable.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
}
}
return newDataTable;
}

标签:Rows,DataTable2,DataTable1,newDataTable,合并,Add,新表,DataTable
From: https://www.cnblogs.com/Dongmy/p/17339571.html

相关文章

  • w5-1 序列合并
     方法一:#include<iostream>#include<queue>usingnamespacestd;//排序模拟,tle做法intnow1[100000],now2[100000];intmain(){intn;priority_queue<int,vector<int>,greater<int>>pq;cin>>n;for(inti=0;i<......
  • [Leetcode]合并两个有序链表
    力扣链接依次比较,取小的尾插:初步代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*mergeTwoLists(structListNode*list1,structListNode*list2){structListNode*......
  • 【LeetCode剑指offer 03】合并两个/K个排序链表
    合并两个排序链表https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4,1->3->4输出:1->1->2->3->4->4限制:0<=链表长度<=1000思路代码classSolutio......
  • Oracle将想要查询的时间点集合作为一个新表,去另一个表里只查询规定时间点的数据
    最近遇到一个新需求,我们需要在一个表中选取特定时间段内一些固定时间点的数据(比如只想要取每个小时零点的数据),废物的我想不出来,让大佬教的,记录一下。假如这个表长这样,名字就叫Table吧,需要取到每个小时零点的高度 TIMEHEIGHT2023-04-1800:00:0012023-04-1801:00......
  • 【python-docx】添加表格、合并单元格、设置样式
    1.表格1.1添加表格添加表格很简单,只需要调用一下add_table()即可,返回一个Table对象,参数可以指定行、列、样式fromdocximportDocumentdoc=Document()#添加一个5行3列的表格,样式是网格实线table=doc.add_table(5,3,style="TableGrid")doc.save('./test.docx')1.2添......
  • 多个中式表格合并并转换(Power Query)
    数据源:转换结果:let源=Excel.Workbook(File.Contents(".....xlsx")),整理表=Table.SelectColumns(Table.SelectRows(源,each([Kind]="Sheet")andText.EndsWith([Name],"区")),{"Data"}),展开表=Table.ExpandTableCo......
  • [技术讨论]电商业务中的业务合并问题
    今天第一次写这个,其实,这些事情在10年前的erp和其他项目中都是有相应的解决方案的。最近在京东采购了两个单子,遇到了下面的问题:1、发过来的衣服是180/100A的,我只能穿175的,申请换货。2、数码相机28exr的取景器内特别模糊,而液晶屏很清晰,我确认不是我眼睛的问题,所以,只能申请换货。京东......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描一次之后就可以确保最后一个元素位于正确的顺序,接着逐步进......
  • git合并代码原理
    背景:最近在做体测,当我将prod-wmj合并到我新建的test-physical分支上的时候,出现超出我认知范围的现象,所以我认为git的原理我们没有搞懂,还要搞搞。merge的时候红色部分并不是我理解的目标分支的代码,那就让我们来想想吧~操作:1、首先提出来问题,代码更改有几种形式?git又是怎么做的?如果你......
  • poj2750(线段树+复杂区间合并)
    PottedFlowerPOJ-2750思路:我们将题目简单化,假设我们要求的是序列的最大连续子段和,且可以包括所有数。我们的线段树需要维护这段区间的最大前缀和pre,最大后缀和suf,区间和sum,区间连续最大和mx。那么难点就在于如何由子节点更新父节点。我们可以知道,tr[p].sum=tr[lc].sum......