C#实现两个DataTable比对并统计每行差异列数
问题背景
我每天都会收到固定格式的电子表格,示例结构如下:
| STATE | Probable | Confirmed | Total | Deaths |
|---|
- 表格无缺失单元格,最多包含60行数据(含属地),实际列数约为10列,示例仅作结构参考
- 日常核心工作之一是比对当日电子表格与前一日电子表格的数据差异
- 现有代码可正常识别存在数据差异的STATE(州),但无法统计对应行的差异列总数:部分州仅1列存在差异,部分州除首列外多列存在差异
期望输出
新增差异列数统计功能,例:仅阿拉斯加州(3列差异)、德克萨斯州(1列差异)存在数据不同时,输出格式如下:
Alaska (3)
Texas (1)
现有可运行代码(无差异计数功能)
DataTable dt1 = GetDataTable(xlPath); DataTable dt2 = GetDataTable(xlPathYest); var diffStates = new List<string>(); for (int i = 0; i < dt1.Rows.Count; i++) { if (!dt1.Rows[i].ItemArray.SequenceEqual(dt2.Rows[i].ItemArray)) { diffStates.Add((string)dt1.Rows[i][0]); } } diffDT = string.Join(Environment.NewLine, diffStates.Where(s => !string.IsNullOrWhiteSpace(s))); Console.WriteLine(diffDT);
实现方案
直接修改差异行的处理逻辑:将原存储州名的列表改为存储「州名+差异列数」的元组,检测到行差异后逐列遍历(默认跳过首列州名字段)统计差异值数量即可,修改后完整代码如下:
DataTable dt1 = GetDataTable(xlPath); DataTable dt2 = GetDataTable(xlPathYest); // 存储存在差异的州名及对应差异列数 var diffStates = new List<(string StateName, int DiffCount)>(); for (int i = 0; i < dt1.Rows.Count; i++) { DataRow todayRow = dt1.Rows[i]; DataRow yestRow = dt2.Rows[i]; // 先判断整行是否存在差异 if (!todayRow.ItemArray.SequenceEqual(yestRow.ItemArray)) { int diffColCount = 0; // 从索引1开始遍历,跳过首列STATE名称,如需统计首列差异将初始值改为0即可 for (int col = 1; col < dt1.Columns.Count; col++) { if (!Equals(todayRow[col], yestRow[col])) { diffColCount++; } } diffStates.Add(((string)todayRow[0], diffColCount)); } } // 按要求格式拼接输出内容 diffDT = string.Join(Environment.NewLine, diffStates .Where(item => !string.IsNullOrWhiteSpace(item.StateName)) .Select(item => $"{item.StateName} ({item.DiffCount})")); Console.WriteLine(diffDT);
代码说明:
- 逐列比对使用
Equals方法,兼容字符串、数值、日期等所有单元格存储类型,比对逻辑和原有SequenceEqual完全一致 - 默认跳过首列州名字段的差异统计,如果需要将首列也纳入计数,把循环初始值
col = 1改为col = 0即可 - 输出格式完全匹配需求示例
内容的提问来源于stack exchange,提问作者User_zyp9
相关产品推荐
相关产品推荐

