bhwhui 发表于 2014-4-15 16:12:26

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

本帖最后由 bhwhui 于 2014-4-15 22:16 编辑

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

afan 发表于 2014-4-15 16:43:10

用我在该贴的回复 http://www.autoitx.com/thread-44036-1-2.html 正则替换方式试试
从50万行数据查找并删除了重复数据2千多行,本机耗时约2分钟。

bhwhui 发表于 2014-4-15 16:49:39

本帖最后由 bhwhui 于 2014-4-15 16:51 编辑

晕菜啊,对正则不熟悉啊,正则还能这样用?
现在将就的方法,先数组排序,逐个去重,好像快些了。

kevinch 发表于 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
        $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)这个也可以试下

MaGiCmAn 发表于 2014-4-15 18:21:51

回复 4# kevinch
我想请教kevinch很久了。
请问哪里有au3中字典用法的说明档之类的资料?我想系统学习下。

light_he 发表于 2014-4-15 18:47:15

回复 4# kevinch

这个不错,30多秒,学习了

kevinch 发表于 2014-4-15 21:22:55

回复 5# MaGiCmAn
看vb的就可以了,其实字典对象没多少属性和方法

bhwhui 发表于 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) 多重检索的语句(自己数据库实例用的少,网上例子没那么多时间搞明白)就没测了,会不会有惊喜呢?
谢谢各位的帮助,谢谢。

bhwhui 发表于 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)

bhwhui 发表于 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
      $dic($arr[$n])=""
Next
$arr=$dic.keys
$str=""
For $n=0 To UBound($arr)-1
      $str&=$arr[$n]&@CRLF
Next
FileWrite($wfile,$str)

joyran 发表于 2014-4-16 03:58:29

大家都是高手啊!赞

MaGiCmAn 发表于 2014-4-17 21:18:19

回复 7# kevinch
谢谢指教!

bhwhui 发表于 2014-4-20 12:38:58

本帖最后由 bhwhui 于 2014-4-22 23:32 编辑

正则去重方法有遗漏,请高手改正........

xms77 发表于 2014-4-20 21:26:39

学习了,原来字典对象这么好用啊!

yongge9999 发表于 2014-4-21 10:22:59

回复 7# kevinch
使用字典法,效率很高,感谢分享。
页: [1]
查看完整版本: 【已解决】请教对50万行数据的高效去重方法。