日期:2014-05-17  浏览次数:20961 次

C#如何实现对资料按固定格式去重复?
各位大虾,请教问题如下:
1022012061513585300A21950001
1032012061609083100A21950001
1032012061609083800A21950001
以上是用 指纹卡钟导出的考勤记录,格式如第一条(1022012061513585300A21950001)说明:
卡钟编号三位【如102】,日期时间16位【20120615135853】,固定格式添加两个‘0’,工号六位【A21950】,固定格式【001】

但发现卡钟没有 在同一时间段防止重复验证的功能,导致一个员工可以多次按压指纹验证,导出的记录就出现在同一时间段多条重复记录,如上面第二,第三条测试记录。同一天在上午09:08 验证了两次 。这样就没办法直接导入到我们的人事系统做考勤处理。
因为考勤软件没办法改,我想做一个C#的小程序实现去重复功能,只要同一天同一个时间段验证次数>=2,删除一条记录,保留最后一次验证记录,请大虾们给点指点。

------解决方案--------------------
先排序,后遍历.最后删除不符合的记录
------解决方案--------------------
打开时间肯定是有序的,按时间排列的,那打卡时,你就先去里面找是否有重复时间段的,比如(103201206160908),如果有,就不在记录了,因为是有序的内容,所以对于查找方法,可以采用二分法
------解决方案--------------------
你的逻辑不是都有了么?
将日期时间和工号单独提取出来对比,
在一个时间段,比如早上10点前如果有重复,以第1个为准,
下午4点后有重复以最后一个为准,
这样看,可以只保留同一天第1次和最后一次就行了
------解决方案--------------------
一个示例,以分为限排重
C# code
string[] array = { "1022012061513585300A21950001", "1032012061609083100A21950001", "1032012061609083800A21950001" };

SortedList<string, Tuple> slist = new SortedList<string, Tuple>();
foreach (var item in array)
{
    string key = item.Substring(19, 6) + item.Substring(3, 12);
    string clock = item.Substring(0, 3);
    int second = int.Parse(item.Substring(15, 2));
    Tuple tuple;
    if (slist.TryGetValue(key, out tuple))
    {
        if (tuple.second < second)
        {
            tuple.clock = clock;
            tuple.second = second;
        }
    }
    else
    {
        tuple = new Tuple { clock = clock, second = second };
        slist.Add(key, tuple);
    }
}

string[] result = new string[slist.Count];
for (int i = 0; i < slist.Count; i++)
{
    string key = slist.Keys[i];
    Tuple tuple = slist.Values[i];
    result[i] = string.Concat(tuple.clock, key.Substring(6), tuple.second.ToString("D2"), "00", key.Substring(0, 6), "001");
}