找回密码
 加入
搜索
楼主: 骗子

[效率算法] 文本对比的效率算法【已解决】

 火.. [复制链接]
发表于 2012-12-17 00:31:20 | 显示全部楼层
唉。。我用excel一拉就可以。。。。。

  在数据处理中,通常有些数据需要我们对比筛选出不重复数据或重复的数据,下面从网上搜集来的方法将教你使用excel怎样分别对比两列数据。
本文非我原创,但我忘了出处。
  如何将EXCEL两列比较后不重复的数据复制到另一列上
  假如你要比较A列与B列数据是否重复,应该有三种结果(即AB皆有,A有B无,B有A无),可在C列存放A有B无的数据,在D列存放B有A无的数据,然后再将两列数据合并即可,方法如下:
1、在C1单元格输入公式:
=IF(COUNTIF($B:$B,A1)=0,A1,"")
在D1单元格输入公式:
=IF(COUNTIF($A:$A,B1)=0,B1,"")
将两个公式用填充柄向下复制到相应的行。
2、按C列排序,将C列数据集中在一起,将其复制到另一工作表的A列;再按D列排序,将D列数据集中在一起,并将其复制到另一工作表的A列的尾部。(注意:这两个操作要用“选择性粘贴/数值”进行粘贴)
3、删除原表的CD两列,将另一工作表中A列的数据复制回原表的C列。

  我给你一个最简单的方法吧。
  假设数据在Sheet1表的AB列,A列数据多,将B列数据剪切到另一个工作表Sheet2的A上,注意两个表的标题一定要相同才行,比如两表的A1单元格教设置为”数据“。
对Sheet1执行”高级筛选“,列表区域就是表中A列数据,条件区域选择Sheet2表中A列的数据(注意,选择时一定要将标题也选上)。这样呢Sheet1中就会显示出两表中共有的数据。选中这些数据行(注意是行),选择删除。再选择数据菜单==筛选==全部显示,这样Sheet1表中只有Sheet1有,Sheet2没有的数据。同理,如果一开始对Sheet2表进行高级筛选,就会获得Sheet2中有而Sheet1没有的数据。

  很简单。
  比如有A列和B列的数据需要找出不重复的,首先将B列的数据也剪贴都A列后边,然后在B列任意填写数字,比如全部是1,再根据A列对B列分类汇总。最后A列里带“汇总”的就都是不重复的。
然后需要将A列里后边带“汇总”的数据挑出来即可。方法如下:将A列数据复制并选择性粘贴(只选择数据)到新的工作表中A列中,在B列输入公式,例如B2单元格输入:=if(right(A2,2)="汇总","A","B"),下拉。然后根据B列排序,所有带“汇总”的数据将排在最前边,删除后边的即可。

  Excel中两列比较的一个典型实例 先看一个表: ABCDE
            1去年名单 今年名单 在职老员工 离职老员工 新任员工
            2张一王一
            3张二张一
            4张三王三
            5张四李四
            6李一张三
            7李二李二
            8李三陈帅哥
            9李四张美女
            10田大娘杨大哥
            11吴学田大娘
            12吴学
  假如这个表是某公司去年和今年的员工名单,现在要求在职老员工名单,也就是在A列也在B列的员工,同样离职老员工是指在A列不在B列的员工,新任员工指在B列不在A列的员工。如果用A表示去年员工的集合,B表示今年员工的集合,则用数学语言表示是:
      在职老员工=AB      (AB表示A交B)
      离职老员工=A - B  
      新任员工=B - A
      在Excel里,这里要用到两个函数,一个是if(),另一个是countif(),具体每个函数的使用方法这里不多说,请查看Excel帮助。这里countif()的作用是测试某一个元素(成员)是不是在某集合(列),如果其值大于0,在说明该元素属于某集合,否则不属于。if()的作用是根据countif()测试的结果来赋予某一单元格的值。具体公式如下:
      在单元格C2输入:=IF(COUNTIF(B$2:B$12,A2),A2,"")   
      说明:为了方便拖拉填充,需要把范围固定,即在数字前面加一个“$”符号,如:B$2:B$12。B$2:B$12表示一个范围,相当于集合B。COUNTIF(B$2:B$12,A2)的意思就是在范围B$2:B$12里统计单元格A2的值出现的次数,这样语句IF(COUNTIF(B$2:B$12,A2),A2,"")就表示,如果统计次数大于0则单元格C2的值等于A2,否则就等于""(即空)。以下公式类似,不再赘述。
      在单元格D2输入:=IF(COUNTIF(B$2:B$12,A2),"",A2)
      在单元格E2输入:=IF(COUNTIF(A$2:A$11,B2),"",B2)
      注意,其中C、D两列只要填充到11就行了,因为这两列都是拿A列的元素进行测试,而A列的元素只到A11。同理E列就要填充到12。另外还要注意范围的选取,不要搞错了。
      输完以上公式并且填充完,结果如下:
             ABCDE
            1去年名单今年名单在职老员工离职老员工新任员工
            2张一王一张一 王一
            3张二张一 张二 
            4张三王三张三 王三
            5张四李四 张四 
            6李一张三 李一 
            7李二李二李二  
            8李三陈帅哥 李三陈帅哥
            9李四张美女李四 张美女
            10田大娘杨大哥田大娘 杨大哥
            11吴学田大娘吴学  
            12 吴学   
      需要强调的是,为了一般化,这里选取了A、B两列的名单个数是不一样的,排列顺序也不一样。
发表于 2012-12-17 00:33:05 | 显示全部楼层
其实类似au3的这个对比功能我也写过,不过还是没有excel好用,个人能力不行啊。。。希望可以帮到你吧
发表于 2014-5-20 23:58:59 | 显示全部楼层
学习了!希望此等好贴越多越好!又学到一招!
发表于 2014-6-19 00:05:49 | 显示全部楼层
回复 8# afan


    a大为何我运行这段代码测试后c.txt中的数据和B.txt中的一样呢?应该只有未重复的才对啊……
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-13 13:51 , Processed in 0.065247 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表