请教一个关于排序取前缀值的问题~![已解决]
本帖最后由 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 ,$line,"")
Next我尝试排了一下,并不理想,不是把相同的给排到最前面。是不是我方法用错了吗?希望大家能指点一下谢谢了。
正解在十八楼。谢谢各位的帮助。十分感谢。十八楼对不起。打错字 了。本一打不错的。打成不是了……尴尬…… 回复 1# xx44t10
亲,你的代码里面没有排序哦~
看看是不是要这样的效果??
回复 2# annybaby
不是这样的效果 。是取相同的hash值 排到前面。 目的就是取hash值来区别相同的文件。然后把路径 写到txt 文件。这样就我方便删除不要的 了 回复 3# xx44t10
我先回去复习下小学语文先~
呵呵~ stringregexp($txt,'.*(?>0xF5808).+',3) 回复 4# annybaby
我承认是我没表达清楚。说简单点。就是txt取 最后那个值 如果相同就取 同行前面的那个路径 就这样啊。 回复 3# xx44t10
如果只是要实现单纯的功能,可能有两种“曲线救国”方向:
1、先写入列表,再利用列表排序,再处理排序后的信息
2、写入数据库(DBF,MDB都可以),利用指令排序索引
如果只是要正则解决,那呼唤AFAN大侠吧。 回复 7# 楼上风云
我先把hash值给正则出来 然后查找把相同的hash值 每一行的都写到一个文件就行了。你看我这个思路行不行。请指教哦。 本帖最后由 sanmoking 于 2012-11-11 13:58 编辑
回复 1# xx44t10
首先把你的test.txt文件转换成ini格式的,如下:
文件: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值:”(前面有个空格)转换成“=hash值:”,这样就是一个标准的ini文件了。
然后用IniReadSection读取字段,然后再用_ArraySort来排序数组。
具体代码如下:
#include <Array.au3>
$fini = @ScriptDir & "\test.ini"
$ini = IniReadSection($fini,"data")
_ArraySort($ini, 0, 0, 0, 1)
For $i = 1 To $ini
;~ IniDelete($fini,"data",$ini[$i])
IniWrite($fini,"data-"&@YEAR&@MON&@HOUR&@MIN&@SEC,$ini[$i],$ini[$i])
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。 回复 9# sanmoking
这是一个好思路!
生成TXT的时候,可以直接生成INI,再用数组排序。 回复 10# 楼上风云
结果和我2楼的一样啊,都不是楼主想要的~~ 本帖最后由 netegg 于 2012-11-11 17:55 编辑
不是简单排序问题,是hash值前面部分相同的,提取二维数组的文件路径那个元素
#include <file.au3>
_filewritetoline($ini, '', 1)
$ret = IniReadSection($ini, 'data')
For $i = 1 To $ret-1
For $j = $i+1 To $ret
If StringInStr(StringLeft($ret[$i],StringLen('hash值:0xF5808')), StringLeft($ret[$j], StringLen('hash值:0xF5808'))) Then ConsoleWrite($ret[$i]&@cr&$ret[$j]&@cr&@cr)
Next
Next 回复 12# netegg
应该也不是楼主想要的, 楼主实际上并不是想查找指定的hash值的文件,而是在一大堆hash中把相同的找出来,并把它对应的文件的路径放在一起,方便他删除~~
可能到最后,我们所有人都发现,是在做无用功~~ 回复 13# annybaby
你运行了吗? 有个字符获取命令
页:
[1]
2