C#如何实现对资料按固定格式去重复?
各位大虾,请教问题如下:
1022012061513585300A21950001
1032012061609083100A21950001
1032012061609083800A21950001
以上是用 指纹卡钟导出的考勤记录,格式如第一条(1022012061513585300A21950001)说明:
卡钟编号三位【如102】,日期时间16位【20120615135853】,固定格式添加两个‘0’,工号六位【A21950】,固定格式【001】
但发现卡钟没有 在同一时间段防止重复验证的功能,导致一个员工可以多次按压指纹验证,导出的记录就出现在同一时间段多条重复记录,如上面第二,第三条测试记录。同一天在上午09:08 验证了两次 。这样就没办法直接导入到我们的人事系统做考勤处理。
因为考勤软件没办法改,我想做一个C#的小程序实现去重复功能,只要同一天同一个时间段验证次数>=2,删除一条记录,保留最后一次验证记录,请大虾们给点指点。
[解决办法]
先排序,后遍历.最后删除不符合的记录
[解决办法]
打开时间肯定是有序的,按时间排列的,那打卡时,你就先去里面找是否有重复时间段的,比如(103201206160908),如果有,就不在记录了,因为是有序的内容,所以对于查找方法,可以采用二分法
[解决办法]
你的逻辑不是都有了么?
将日期时间和工号单独提取出来对比,
在一个时间段,比如早上10点前如果有重复,以第1个为准,
下午4点后有重复以最后一个为准,
这样看,可以只保留同一天第1次和最后一次就行了
[解决办法]
一个示例,以分为限排重
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");}