找回密码
 加入
搜索
查看: 11920|回复: 23

[效率算法] 请教一个关于排序取前缀值的问题~![已解决]

 火.. [复制链接]
发表于 2012-11-10 14:12:36 | 显示全部楼层 |阅读模式
本帖最后由 xx44t10 于 2012-11-11 20:11 编辑

不知道这个是不是排序之类的哦。有文件与说明,希望大家能帮助我一下。
test.txt文本是。
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\Hash.au3 hash值:0x9FE062B199B67CBF8C5933DA1EF5EF382DB460DC
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\全盘文件存档.au3 hash值:0x46527348A86B0BBE796098DB8BBC3489338B235E
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\存当前文件全路径.au3 hash值:0xD8689EDBE7499F1E7EA03C540D2EDCB8B5848852
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\排序.au3 hash值:0x579F2E1278B1B1846FC0E4058931F3E71F16E288
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\排序2.au3 hash值:0x9C856E87D7A3A55C92FC3103800B0F530B99537C
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新.au3 hash值:0xEF9640D8C983766C29C50B6CD9A7CCC5D8C2C83F
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建 AutoIt v3 脚本 (2).au3 hash值:0x3651F6DFF6B3C4C1CCA25A9B6329CDA7BA486226
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建 AutoIt v3 脚本.au3 hash值:0x07AF5863828AC2D4CD8B2C1CA26BDDC949AAA364
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建 AutoIt v3.au3 hash值:0x403201B512DBF522F7495DD0CAC4274CCB8D6381
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\h.ash hash值:0x0CC5B69A46EB77B80088B7FBEA1E8D1EF5192A6A
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\test.txt hash值:0x9EE99B7399200BDD5A67A63348F53671CC7392C6
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\存当前文件全路径.au3 hash值:0xD8689EDBE7499F1E7EA03C540D2EDCB8B5848852
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\读h.ash写hash值到test文件.au3 hash值:0xF5808977E69CC0419F2AA7A2AE95E330EC03A5A4
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 hash值:-1
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2)\PC1.txt hash值:0xA1C93CB0A0FA91369606382D2E7905A8292EFE93
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2)\PC1_duplicatioin.xls hash值:0xE6E2BC9467D985B958BA2C63DC5C5CE52A4F1D15
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2)\新建 AutoIt v3 脚本.au3 hash值:0x4A8E377EDF35006E8019FC4C59206CD0076133F0
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2) hash值:-1
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\读h.ash写hash值到test文件.au3 hash值:0xF5808977E69CC0419F2AA7A2AE95E330EC03A5A4
找hash值:0xF5808**这种相同的就把前面的 路径 的字符串给提出来 写入一个txt文件中。
搜过 论坛 找到
#Include <File.au3>
$sfile = "test.txt"
$afile = "已整理.txt"
For $n = 1 To _FileCountLines($sfile)
        $line = FileReadLine($sfile,$n)
        $sline = StringSplit($line,"0x",2)
        IniWrite($afile,$sline [2],$line,"")
Next
我尝试排了一下,并不理想,不是把相同的给排到最前面。是不是我方法用错了吗?希望大家能指点一下谢谢了。
正解在十八楼。谢谢各位的帮助。十分感谢。十八楼对不起。打错字 了。本一打不错的。打成不是了……尴尬……
发表于 2012-11-10 14:49:49 | 显示全部楼层
回复 1# xx44t10

亲,你的代码里面没有排序哦~

看看是不是要这样的效果??

本帖子中包含更多资源

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

×
 楼主| 发表于 2012-11-10 15:51:02 | 显示全部楼层
回复 2# annybaby


    不是这样的效果 。是取相同的hash值 排到前面。 目的就是取hash值来区别相同的文件。然后把路径 写到txt 文件。这样就我方便删除不要的 了
发表于 2012-11-10 16:11:48 | 显示全部楼层
回复 3# xx44t10

我先回去复习下小学语文先~
呵呵~
发表于 2012-11-10 16:24:02 | 显示全部楼层
stringregexp($txt,'.*(?>0xF5808).+',3)
 楼主| 发表于 2012-11-10 16:52:31 | 显示全部楼层
回复 4# annybaby


    我承认是我没表达清楚。说简单点。就是txt取 最后那个值 如果相同就取 同行前面的那个路径 就这样啊。
发表于 2012-11-11 08:26:49 | 显示全部楼层
回复 3# xx44t10

如果只是要实现单纯的功能,可能有两种“曲线救国”方向:
1、先写入列表,再利用列表排序,再处理排序后的信息
2、写入数据库(DBF,MDB都可以),利用指令排序索引
如果只是要正则解决,那呼唤AFAN大侠吧。
 楼主| 发表于 2012-11-11 13:15:50 | 显示全部楼层
回复 7# 楼上风云


    我先把hash值给正则出来 然后查找把相同的hash值 每一行的都写到一个文件就行了。你看我这个思路行不行。请指教哦。
发表于 2012-11-11 13:46:49 | 显示全部楼层
本帖最后由 sanmoking 于 2012-11-11 13:58 编辑

回复 1# xx44t10


    首先把你的test.txt文件转换成ini格式的,如下:
[data]
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\Hash.au3=hash值:0x9FE062B199B67CBF8C5933DA1EF5EF382DB460DC
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\全盘文件存档.au3=hash值:0x46527348A86B0BBE796098DB8BBC3489338B235E
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\存当前文件全路径.au3=hash值:0xD8689EDBE7499F1E7EA03C540D2EDCB8B5848852
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\排序.au3=hash值:0x579F2E1278B1B1846FC0E4058931F3E71F16E288
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\排序2.au3=hash值:0x9C856E87D7A3A55C92FC3103800B0F530B99537C
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新.au3=hash值:0xEF9640D8C983766C29C50B6CD9A7CCC5D8C2C83F
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建 AutoIt v3 脚本 (2).au3=hash值:0x3651F6DFF6B3C4C1CCA25A9B6329CDA7BA486226
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建 AutoIt v3 脚本.au3=hash值:0x07AF5863828AC2D4CD8B2C1CA26BDDC949AAA364
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建 AutoIt v3.au3=hash值:0x403201B512DBF522F7495DD0CAC4274CCB8D6381
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\h.ash=hash值:0x0CC5B69A46EB77B80088B7FBEA1E8D1EF5192A6A
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\test.txt=hash值:0x9EE99B7399200BDD5A67A63348F53671CC7392C6
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\存当前文件全路径.au3=hash值:0xD8689EDBE7499F1E7EA03C540D2EDCB8B5848852
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹\读h.ash写hash值到test文件.au3=hash值:0xF5808977E69CC0419F2AA7A2AE95E330EC03A5A4
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹=hash值:-1
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2)\PC1.txt=hash值:0xA1C93CB0A0FA91369606382D2E7905A8292EFE93
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2)\PC1_duplicatioin.xls=hash值:0xE6E2BC9467D985B958BA2C63DC5C5CE52A4F1D15
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2)\新建 AutoIt v3 脚本.au3=hash值:0x4A8E377EDF35006E8019FC4C59206CD0076133F0
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\新建文件夹 (2)=hash值:-1
文件:C:\Documents and Settings\Administrator\桌面\新建文件夹\读h.ash写hash值到test文件.au3=hash值:0xF5808977E69CC0419F2AA7A2AE95E330EC03A5A4
也就是在文本最前面加了个[data]的字段名,然后把“ hash值:”(前面有个空格)转换成“=hash值:”,这样就是一个标准的ini文件了。
然后用IniReadSection读取[data]字段,然后再用_ArraySort来排序数组。
具体代码如下:
#include <Array.au3>
$fini = @ScriptDir & "\test.ini"
$ini = IniReadSection($fini,"data")
_ArraySort($ini, 0, 0, 0, 1)
For $i = 1 To $ini[0][0]
;~ IniDelete($fini,"data",$ini[$i][0])
IniWrite($fini,"data-"&@YEAR&@MON&@HOUR&@MIN&@SEC,$ini[$i][0],$ini[$i][1])
Next
ShellExecute($fini)

如果你的数据太多,IniReadSection由于遗留原因, 仅读取 32767 个字符,那你可以用论坛的udf<_Ini.au3>里面的函数来读取。

另外上述方法有个问题,就是如果你的文件路径里面有“=”存在,那么ini文件读取的时候就有点小问题,
注意:
          对于特殊的键与值,如“abc=123=AAA” 原则上“abc”应该才为关键字,“123=AAA”为值,
          本想规范之,但觉得有时候可能会有“abc=123”为关键字,“AAA”为值的需求(内置函数是没得选的),
          因此,这里不强制为第一种情况,只需注意如下几点(当然,只有1个等号就无需注意这些了):
          1,_IniReadSection 这个将保持为仅适用第一种情况,“abc”为关键字,“123=AAA”为值
          2,_IniDelete、_IniRead、_IniRenameKey、_IniWrite 可同时适用两种情况。

上面是udf<_Ini.au3>的作者的说明,所以不知道你的test.txt文件是怎么获得的,
如果可能的话,你转换成ini的时候可以把hash值放在前面当做关键字,路径放后面当作值。
这样就不存在多个=号的问题了,当然用_ArraySort排序的时候最后一个参数(二维数组中用于排序的子索引)就要改成0。
发表于 2012-11-11 17:07:15 | 显示全部楼层
回复 9# sanmoking

这是一个好思路!
生成TXT的时候,可以直接生成INI,再用数组排序。
发表于 2012-11-11 17:16:30 | 显示全部楼层
回复 10# 楼上风云

结果和我2楼的一样啊,都不是楼主想要的~~
发表于 2012-11-11 17:40:47 | 显示全部楼层
本帖最后由 netegg 于 2012-11-11 17:55 编辑

不是简单排序问题,是hash值前面部分相同的,提取二维数组的文件路径那个元素[au3]
#include <file.au3>
_filewritetoline($ini, '[data]', 1)
$ret = IniReadSection($ini, 'data')
For $i = 1 To $ret[0][0]-1
        For $j = $i+1 To $ret[0][0]
        If StringInStr(StringLeft($ret[$i][1],StringLen('hash值:0xF5808')), StringLeft($ret[$j][1], StringLen('hash值:0xF5808'))) Then ConsoleWrite($ret[$i][0]&@cr&$ret[$j][0]&@cr&@cr)
        Next
Next[/au3]
发表于 2012-11-11 18:19:56 | 显示全部楼层
回复 12# netegg


应该也不是楼主想要的, 楼主实际上并不是想查找指定的hash值的文件,而是在一大堆hash中把相同的找出来,并把它对应的文件的路径放在一起,方便他删除~~

可能到最后,我们所有人都发现,是在做无用功~~
发表于 2012-11-11 18:22:25 | 显示全部楼层
回复 13# annybaby
你运行了吗?
发表于 2012-11-11 19:23:37 | 显示全部楼层
有个字符获取命令
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 06:58 , Processed in 0.102586 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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