首页 新闻 会员 周边

怎样将DataTable中的重复数据筛选出来

0
悬赏园豆:10 [已解决问题] 解决于 2016-08-18 09:12

有一个Excel导入的需求,但是Excel里面可能有重复数据,导入到数据库中肯定是要报错的,想把这些重复的数据给筛选出来,在做导入的时候是把数据先放入到DataTable中,怎样将Datatable中的这些重复数据给筛选出来放入另外一个DataTable呢?需要说明一点的是,Excel里面的数据是两个字段的联合主键,比如ItemCode+ DistributorCode作为主键,既只要有两个这段的值跟这两个字段值一样的时候就是重复的数据,黄色标记的部分就是重复的数据,该怎样来筛选呢?

gyangjing的主页 gyangjing | 初学一级 | 园豆:4
提问于:2016-08-17 13:53
< >
分享
最佳答案
1

我写个例子给你,很简单的,你很快就能看懂.

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);
            }
        }
    }
}

 

收获园豆:10
需要格局 | 老鸟四级 |园豆:2145 | 2016-08-17 15:35

或许老兄的办法是一个可行的办法,明天一定得试试!

gyangjing | 园豆:4 (初学一级) | 2016-08-17 16:22

@gyangjing:我的一定可以的,10个圆豆给我吧

需要格局 | 园豆:2145 (老鸟四级) | 2016-08-17 16:25

@田麦成: 哈哈哈,这个必须的!

gyangjing | 园豆:4 (初学一级) | 2016-08-18 09:11
其他回答(3)
0

foreach?

顾晓北 | 园豆:10844 (专家六级) | 2016-08-17 14:22

怕没这么简单呢,使用 

DataTable dtRs = new DataTable();
DataView dv = new DataView(dt);
dtRs = dv.ToTable(true, new[] { "ItemCode", "DistributorCode", "AdvancePrice", "UserCode" });

这样最终得到的结果是过滤到重复的数据后的结果,但是那些重复的数据却没法得到。。。

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-17 14:36

@gyangjing: 你得到哪些重复的数据干嘛?

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2016-08-17 14:44

@顾晓北: 要告诉操作的人,导入了多少条 ,还有多少条重复没有导入进去,这些重复的数据是哪些,这样更明确

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-18 09:10
0

NPOI Excel 导入1万条数据  ,你使用的那种方式?

写代码的小2B | 园豆:4371 (老鸟四级) | 2016-08-17 15:38

用的是SqlBulkCopy,速度大增啊,就是里面不能出现重复的数据,有重复的数据直接抛异常了,这个是非常不好的

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-17 16:20

@gyangjing: 

我是说从excel到datatable,你用的那种方式?

支持(0) 反对(0) 写代码的小2B | 园豆:4371 (老鸟四级) | 2016-08-17 16:21

@写代码的小2B: Workbook,就是常规操作Excel的方法

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-17 16:25

@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
                {
                    //重复
                }
            }
支持(0) 反对(0) 写代码的小2B | 园豆:4371 (老鸟四级) | 2016-08-17 16:32

@写代码的小2B: 或许这也是一种好的方法,值得去研究一下!3Q

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-17 17:03
1

1:引入CYQ.Data.dll

2:MDataTable dt=datatable;//

3:MDataTable outDt;//返回重复的数据

dt.Distinct(out outDt);//去重复后留下的数据。

4:你要的:DataTable mydt=outDt.ToDataTable();

路过秋天 | 园豆:4787 (老鸟四级) | 2016-08-18 15:05

CYQ.Data.dll这个东西从哪儿得来的??是你自己写的,还是??可否给提供下呢?

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-18 16:21

@gyangjing: nuget上搜cyqdata,github上也有开源的源码。

支持(0) 反对(0) 路过秋天 | 园豆:4787 (老鸟四级) | 2016-08-18 16:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册