找回密码
 加入
搜索
查看: 6273|回复: 14

[效率算法] 【已解决】请教对50万行数据的高效去重方法。

 火.. [复制链接]
发表于 2014-4-15 16:12:26 | 显示全部楼层 |阅读模式
本帖最后由 bhwhui 于 2014-4-15 22:16 编辑

附件为50万行(非随机生成)文本文件,用了数组 _arrayuniqe 命令,数据库(Access )非Ado命令去重,真是晕菜,睡了1个小时过来,竟然还没弄完,只能中断了,这些方法在实际中都不能用,求高效算法。谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-4-15 16:43:10 | 显示全部楼层
用我在该贴的回复 http://www.autoitx.com/thread-44036-1-2.html 正则替换方式试试
从50万行数据查找并删除了重复数据2千多行,本机耗时约2分钟。
 楼主| 发表于 2014-4-15 16:49:39 | 显示全部楼层
本帖最后由 bhwhui 于 2014-4-15 16:51 编辑

晕菜啊,对正则不熟悉啊,正则还能这样用?
现在将就的方法,先数组排序,逐个去重,好像快些了。
发表于 2014-4-15 17:33:05 | 显示全部楼层
$dic=ObjCreate("scripting.dictionary")
If Not IsObj($dic) Then 
        MsgBox(0,"错误","创建对象失败!",5)
        Exit 0
EndIf
$str=FileRead(@ScriptDir&"\file_v.txt")
$arr=StringSplit($str,@CRLF,1)
For $n=1 To $arr[0]
        $dic($arr[$n])=""
Next
$arr=$dic.keys
$str=""
For $n=0 To UBound($arr)-1
        $str&=$arr[$n]&@CRLF
Next
FileWrite(@ScriptDir&"\result.txt",$str)
这个也可以试下
发表于 2014-4-15 18:21:51 | 显示全部楼层
回复 4# kevinch
我想请教kevinch很久了。
请问哪里有au3中字典用法的说明档之类的资料?我想系统学习下。
发表于 2014-4-15 18:47:15 | 显示全部楼层
回复 4# kevinch

这个不错,30多秒,学习了
发表于 2014-4-15 21:22:55 | 显示全部楼层
回复 5# MaGiCmAn
看vb的就可以了,其实字典对象没多少属性和方法
 楼主| 发表于 2014-4-15 21:52:54 | 显示全部楼层
本帖最后由 bhwhui 于 2014-4-15 22:11 编辑

等会我都来试试,报告结果:
1:数据库方式(Access,非ADO方式,排序后1个个检索),时间未知,1个小时后等不及了,关掉了。
2:数组方式(_arrayuniqe排序后1个个分析),约40分钟。 没有用Querylike,估计更慢。
3:正则表达式方式:3.345秒(4核)
4:dic字典方式: 18.41秒(4核)

呵呵,自己赶时间出结果,没有用到Access(Ado) 多重检索的语句(自己数据库实例用的少,网上例子没那么多时间搞明白)就没测了,会不会有惊喜呢?
谢谢各位的帮助,谢谢。
 楼主| 发表于 2014-4-15 22:13:06 | 显示全部楼层
正则代码:
$rfile = FileOpen("d:\!temp1\file_v.txt", 0)
$wfile = FileOpen("d:\!temp1\result2.txt", 2)
$str=FileRead($rfile)
;MsgBox(0, '原字符串', $Str)
$sRE = StringRegExpReplace($str, '(?m)(^\V+)(?:\s*\v+)(?=[^\1]*\1\s*(?=\v|$))', '')
FileWrite($wfile,$str)
 楼主| 发表于 2014-4-15 22:13:41 | 显示全部楼层
字典方式代码:
$dic=ObjCreate("scripting.dictionary")
If Not IsObj($dic) Then
        MsgBox(0,"错误","创建对象失败!",5)
        Exit 0
EndIf

$rfile = FileOpen("d:\!temp1\file_v.txt", 0)
$wfile = FileOpen("d:\!temp1\result.txt", 2)
$str=FileRead($rfile)
;MsgBox(0,"",$str)
$arr=StringSplit($str,@CRLF,1)
For $n=1 To $arr[0]
        $dic($arr[$n])=""
Next
$arr=$dic.keys
$str=""
For $n=0 To UBound($arr)-1
        $str&=$arr[$n]&@CRLF
Next
FileWrite($wfile,$str)
发表于 2014-4-16 03:58:29 | 显示全部楼层
大家都是高手啊!赞
发表于 2014-4-17 21:18:19 | 显示全部楼层
回复 7# kevinch
谢谢指教!
 楼主| 发表于 2014-4-20 12:38:58 | 显示全部楼层
本帖最后由 bhwhui 于 2014-4-22 23:32 编辑

正则去重方法有遗漏,请高手改正........
发表于 2014-4-20 21:26:39 | 显示全部楼层
学习了,原来字典对象这么好用啊!
发表于 2014-4-21 10:22:59 | 显示全部楼层
回复 7# kevinch
使用字典法,效率很高,感谢分享。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-17 01:34 , Processed in 0.082394 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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