DataTable列比较差异并将差异写入另一列

时间:2019-07-25 09:55:06

标签: c# datatable closedxml

我正在用c#编写一个应用程序,该应用程序可以自动比较两个不同数据库中的值。

数据在两个.xlsx文件中提供。这些由最终用户加载到应用程序中。然后,从这两个文件中创建一个内存中的数据表。每个一个。

现在,我需要将数据表1的第1列与数据表2的第3列进行比较。 内容的顺序不相同,但它们都是数字,总是数值。 有两种可能的结果:

  • 所有单元格都匹配(但不按顺序排列)。换句话说,数据表1的第1列中的所有单元格也在数据表2的第3列中。没有其他单元格存在。

  • 数据表1的第1列中存在一个单元格,而数据表2的第3列中没有该单元格。在这种情况下,我想将这些单元格写入单独的工作表。我正在使用closedXML,并且已经创建并显示了一个工作簿。

  • 数据表2的第3列中存在一个单元格,而数据表1的第1列中没有该单元格。在这种情况下,我想将这些单元格写入单独的工作表。我正在使用closedXML,并且已经创建并显示了一个工作簿。

我已经考虑过创建一个接受两个参数的函数。两个数据表。然后将对表一的第一列和表3的第三列进行比较。

我正在研究的另一个解决方案是通过ClosedXML将两个DataTables粘贴到工作表中。将相关的列(1和3)提取到另一个单独的工作表中,并对每个循环使用a来比较两个工作表中的所有单元格并获得差异。但是我不知道该如何继续进行,直到将内容不在工作表A的第1列中,而是将其工作表A的第3列中的内容以及工作表B中的内容在第1列而不是第3列中。 >

1 个答案:

答案 0 :(得分:0)

您可以使用Linq查找第1列中的内容,而不是第3列中的内容,反之亦然。

您只需添加 System.Data.DataSetExtensions 即可引用您的项目,例如here

然后是Linq查询:

var dataTable1 = new DataTable();
dataTable1.Columns.Add(new DataColumn("Data Column 1"));

dataTable1.Rows.Add(1, "", "");
dataTable1.Rows.Add(3, "", "");
dataTable1.Rows.Add(5, "", "");
dataTable1.Rows.Add(7, "", "");
dataTable1.Rows.Add(9, "", "");

var dataTable2 = new DataTable();
dataTable2.Columns.Add(new DataColumn("Data Column 1"));
dataTable2.Columns.Add(new DataColumn("Data Column 2"));
dataTable2.Columns.Add(new DataColumn("Data Column 3"));

dataTable2.Rows.Add("", "", 1);
dataTable2.Rows.Add("", "", 2);
dataTable2.Rows.Add("", "", 4);
dataTable2.Rows.Add("", "", 6);
dataTable2.Rows.Add("", "", 7);
dataTable2.Rows.Add("", "", 8);
dataTable2.Rows.Add("", "", 9);

// Use the id of the column
var column1 = dataTable1.AsEnumerable().Select(r => r.ItemArray[0]).ToList();
var column3 = dataTable2.AsEnumerable().Select(r => r.ItemArray[2]).ToList();

// Use the name of the column
var column1WithName = dataTable1.AsEnumerable().Select(r => r.Field<string>("Data Column 1")).ToList();
var column3WithName = dataTable2.AsEnumerable().Select(r => r.Field<string>("Data Column 3")).ToList();

// All element of the Column 1 (DataTable1) that are not in Column 3 (DataTable2)
var column1Without3 = column1.Except(column3).ToList(); // [ "3", "5" ]
// All element of the Column 3 (DataTable2) that are not in Column 1 (DataTable1)
var column3Without1 = column3.Except(column1).ToList(); // [ "2", "4", "6", "8" ]