有一个Excel导入的需求,但是Excel里面可能有重复数据,导入到数据库中肯定是要报错的,想把这些重复的数据给筛选出来,在做导入的时候是把数据先放入到DataTable中,怎样将Datatable中的这些重复数据给筛选出来放入另外一个DataTable呢?需要说明一点的是,Excel里面的数据是两个字段的联合主键,比如ItemCode+ DistributorCode作为主键,既只要有两个这段的值跟这两个字段值一样的时候就是重复的数据,黄色标记的部分就是重复的数据,该怎样来筛选呢?
我写个例子给你,很简单的,你很快就能看懂.
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication19 { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(string)); dt.Columns.Add("Judge", typeof(string)); dt.Rows.Add(new string[] { "AA", "23", "这里重复的数据" }); dt.Rows.Add(new string[] { "BB", "一", "43" }); dt.Rows.Add(new string[] { "AA", "23", "这里重复的数据" }); dt.Rows.Add(new string[] { "DD", "不", "ffffaaaaaaa" }); dt.Rows.Add(new string[] { "EE", "样", "sssssssssssss" }); var sums2 = from emp in dt.Rows.Cast<DataRow>() group emp by new { X = emp.Field<string>("Name"), Y = emp.Field<string>("Age") } into g select new { Peo = g.Key, Count = g.Count() }; foreach (var item in sums2.Where(A=>A.Count>1)) { Console.WriteLine("重复的数据的联合主键为:"+item.Peo); } } } }
或许老兄的办法是一个可行的办法,明天一定得试试!
@gyangjing:我的一定可以的,10个圆豆给我吧
@田麦成: 哈哈哈,这个必须的!
foreach?
怕没这么简单呢,使用
DataTable dtRs = new DataTable();
DataView dv = new DataView(dt);
dtRs = dv.ToTable(true, new[] { "ItemCode", "DistributorCode", "AdvancePrice", "UserCode" });
这样最终得到的结果是过滤到重复的数据后的结果,但是那些重复的数据却没法得到。。。
@gyangjing: 你得到哪些重复的数据干嘛?
@顾晓北: 要告诉操作的人,导入了多少条 ,还有多少条重复没有导入进去,这些重复的数据是哪些,这样更明确
NPOI Excel 导入1万条数据 ,你使用的那种方式?
用的是SqlBulkCopy,速度大增啊,就是里面不能出现重复的数据,有重复的数据直接抛异常了,这个是非常不好的
@gyangjing:
我是说从excel到datatable,你用的那种方式?
@写代码的小2B: Workbook,就是常规操作Excel的方法
@gyangjing:
使用HashSet来去重。
//类似这样的写法 var dt = new DataTable(); var hash = new HashSet<String>(); foreach (DataRow row in dt.Rows) { var key = String.Concat(row["code"], row["name"]); if (hash.Add(key)) { //不重复 } else { //重复 } }
@写代码的小2B: 或许这也是一种好的方法,值得去研究一下!3Q
1:引入CYQ.Data.dll
2:MDataTable dt=datatable;//
3:MDataTable outDt;//返回重复的数据
dt.Distinct(out outDt);//去重复后留下的数据。
4:你要的:DataTable mydt=outDt.ToDataTable();
CYQ.Data.dll这个东西从哪儿得来的??是你自己写的,还是??可否给提供下呢?
@gyangjing: nuget上搜cyqdata,github上也有开源的源码。