读书人

过滤table重复数据,该如何处理

发布时间: 2013-11-05 14:40:42 作者: rapoo

过滤table重复数据
本帖最后由 xiongxing318 于 2013-10-09 15:45:21 编辑 现有表A数据量大概2W左右,是从execl里面导入进来的。表B是从表A Copy来的。
A: 手机号码 发送内容 Index 错误信息
13800000001 200 1
13800000002 200 2
13800000002 15 3
13800000003 220 4
. .
. .
13800019999 550 19999

想要的结果:我要把手机号码重复的数据在表A里面移除掉,并且根据Index在B表里面指定行的错误信息的列填上备注表示该行是重复的。

ps:下面是我的代码

 for (int i = dt.Rows.Count - 1; i > -1; i--)
{
bool bo = false;
DataRow row;
try
{
row = dt.Rows[i];
}
catch (Exception)
{
continue;
}
for (int j = i - 1; j > -1; j--)
{
DataRow row2 = dt.Rows[j];
if (row[0].ToString() == row2[0].ToString())//若该字段相同,则存在重复,将重复行号,手机号码加入dupList
{
bo = true;
failureCount++;
errdt.Select("Index='" + row2["Index"].ToString() + "'")[0]["错误信息"] = "重复(手机号码为" + row2["手机号码"].ToString() + "的所有短信不会发送!)";
dt.Rows.Remove(row2);
}
}
if (bo)//存在重复的记录
{
errdt.Select("Index='" + row["Index"].ToString() + "'")[0]["错误信息"] = "重复(手机号码为" + row["手机号码"].ToString() + "的所有短信不会发送!)";
failureCount++;
dt.Rows.Remove(row);
}
dt.AcceptChanges();
}

ps:其中dt是我上面说明的表A,errdt是表B。我这个代码是一行行的去循环,太慢了。请教各位大神,有没有快速的方法。 我在网上找了,去除重复的,都是保留一条数据,因为我这个业务要求是只要是有手机号码重复的数据都得去掉,因为不知道哪条数据才是正确需要发送的。 数据 table重复 c#
[解决办法]

/// <summary>
/// 验证费用名称是否相同
/// </summary>


/// <param name="dgv">需要验证的dgv</param>
/// <returns>true为不同,false为相同</returns>
private static bool CheckCostNameIsLike(GHDataGridView dgv)
{
bool flag = true;
if (dgv.Rows.Count > 0)
{
DataTable dtCostName = (dgv.DataSource as DataTable).Copy();

DataView dv = new DataView(dtCostName);
if (dv.Count != dv.ToTable(true, "CostName").Rows.Count)
flag = false;
}

return flag;
}


[解决办法]
把数据抽像一下,抽像成一个类。每一条数据为一个对象。

然后A放到哈希表中,手机号作为key.

拿B表中的数据项的手机号去查找哈希表,由此判断。

你已经发过一次帖了。好好想一下,做一下,会收获很多。数据结构不是白学的,你的代码时间复杂度是m*n,用哈希表,只要m+n.
[解决办法]
循环里面用errdt.Select("Index='" + row2["Index"].ToString() + "'")[0]["错误信息"] = "重复(手机号码为" + row2["手机号码"].ToString() + "的所有短信不会发送!)";比较慢
可以考虑将Index设置为primary key
可以将手机号放到HashSet中,自动去重复,通过添加成功来判定没有重复,然后dt.Rows.RemoveAt(j)
[解决办法]
A: 手机号码 发送内容 Index 错误信息
13800000001 200 1
13800000002 200 2
13800000002 15 3
13800000003 220 4
. .
. .
13800019999 550 19999

select
手机号码,
sum(发送内容) as 发送内容,
STUFF((
SELECT ',' + Index
FROM 表 t
WHERE 手机号码 = t.手机号码
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') as 备注
from table
group by 手机号码

读书人网 >C#

热点推荐