找回密码
 加入
搜索
查看: 11001|回复: 19

[效率算法] ▶▶肯求快速找记录的方法(感谢xianhou 已解决)

 火.. [复制链接]
发表于 2010-10-4 00:45:37 | 显示全部楼层 |阅读模式
本帖最后由 touch_xu 于 2010-10-4 18:25 编辑

我要从800多个txt文件(插图1)中找包含指定字符串的记录行(插图2),这此txt未压缩前有400M之大,每个文件都有数千条记录(插图3)。通常我们用一个FindoutRAWdata.bat(有附件,但是加密了)从给定查找字条串的文件中(ID.txt 插图2)查找但是这样很慢,我知道AU3会强大的多一定会快很多倍,但是小弟不才不出一行代码来,所以肯请各位高人帮帮忙。如果给帮做个GUI的在上面显示一下结果,然后保存一下就更好了,多谢了。

本帖子中包含更多资源

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

×

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-10-4 01:46:20 | 显示全部楼层
你要求工具返回的值是 文件名呢还是包含了指定字符串的记录行还是什么呢?
发表于 2010-10-4 01:47:05 | 显示全部楼层
你可以说下你现在的这个工具的工作原理不呢?是打开每一个TXT文件 然后找包含的字符串,对吗?
 楼主| 发表于 2010-10-4 08:02:47 | 显示全部楼层
本帖最后由 touch_xu 于 2010-10-4 08:04 编辑

回复 3# chenxu7601257

这个bat也不是我做的,内容加密了,我也不知道。
我想要的返回结果就是.如果其中一个txt中有要找的内容,就把所在的行的全部内容写入一个新的txt中。找到多个结果也放在同一个txt中重复的也保留,谢谢了。


附件是一个示例,我用1 2 3.txt 代表我要找的文件,ID.txt代表我要的指定内容,运行FindoutRAWdata.bat后返回的结果在findout.txt中。

本帖子中包含更多资源

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

×
发表于 2010-10-4 09:13:24 | 显示全部楼层
本帖最后由 3mile 于 2010-10-4 10:07 编辑

批处理解密如下
cls
@echo off
title search RAW data...
color 2f
move ID.txt ID.zip
copy *.txt all.txt>nul
move ID.zip ID.txt
for /f %%i in (ID.txt) do @findstr "%%i" all.txt>>findout.txt
del all.txt
for /f "tokens=*" %%b in ('dir') do echo "%%b"|find "findout">nul && for /f "tokens=3" %%c in ("%%b") do if "%%c"=="0" goto nofind
if not "%%c"=="0" goto find


:nofind
@echo off
del findout.txt>nul
@echo Not find any relative data
pause && exit

:find
pause|@echo Found RAW data in findout.txt file...
看看这个合不合用
#include <array.au3>
#include <file.au3>

Local $str
If FileExists("findout.txt") Then FileDelete("findout.txt")
$filelist=_FileListToArray(@ScriptDir,"*.txt",0)
$input=InputBox("查找","输入要查找的内容")
If $input='' Then 
    MsgBox(0,0,"没有输入要查询的内容,程序退出")
    Exit
Else
$find='.+'&$input&'.+'
For $i=1 To $filelist[0]
    If $filelist[$i]='ID.txt' Then ContinueLoop
    If StringRegExp(FileRead($filelist[$i]),$find,0) Then
        $temp=StringRegExp(FileRead($filelist[$i]),$find,3)
        $str&=_ArrayToString($temp,@CRLF)&@CRLF
    EndIf
Next
If StringLen($str)>0 Then 
FileWrite("findout.txt",$str)
ShellExecute("findout.txt")
Else
    MsgBox(0,0,"没有查找到内容")
EndIf
EndIf

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-10-4 10:53:54 | 显示全部楼层
本帖最后由 touch_xu 于 2010-10-4 11:04 编辑

回复 5# 3mile

感谢3mile 解密bat,也感谢你为我写的代码!
我是想让程序自动从ID.txt读取我的要找的内容并把找到的结果显示用列表一下(ListBox),查找的内容就不用手动输入了,因为会有很多行要找(我会把要找的内容放在ID.txt中)然后写入findout.txt
没有找到的话就不显示了,也不生成文件,现在文件太大,现在bat也能做这个工作,我想请求大家用au3的目的就是速度快一点。

bat中改过这个:
move ID.txt ID.zip

au3这个代码会不会也同时包括 ID.txt 呢
$filelist=_FileListToArray(@ScriptDir,"*.txt",0)


我试了一下ID中有123 ,2.txt中也有123 ,但是我在输入框中输入了123,找不到结果,麻烦3mile再帮助改一下啊!

本帖子中包含更多资源

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

×
发表于 2010-10-4 11:34:13 | 显示全部楼层
cls
@echo off

for %%j in (源数据\*.txt) do (for /f %%i in (条件数据\ID.txt) do @findstr "%%i" %%j >> 目标数据\findout.txt)


如果新建一个这样的 bat 文件,速度会不会快一些?
建立 3 个子目录,存放不同的 txt 文件。

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-10-4 12:04:13 | 显示全部楼层
本帖最后由 touch_xu 于 2010-10-4 12:20 编辑

回复 7# xianhou

这个我试了一下,xianhou 的代码很简单也能找到结果,但是我的源数据有动动辄几百M,数百个文件,几万条记录,但是条件数据也就是第十行,  一个txt就行了,建文件来就有点麻烦了,  我想有au3搞个GUI,上面加Edit,CTRL+V 进出条件数据也行,不用id.txt也行,找到了再生成一个findout.txt就好。

cls
@echo off
for %%j in (源数据\*.txt) do (for /f %%i in ID.txt do @findstr "%%i" %%j >> findout.txt)

这样方便一些,我要的就是速度快,不太想用批处理的,请大侠们再帮改一下。
发表于 2010-10-4 13:01:07 | 显示全部楼层
我想 au3 不会比 bat 更快。
发表于 2010-10-4 16:39:16 | 显示全部楼层
#include <array.au3>
#include <file.au3>

Dim $filelist
$filelist = _FileListToArray(@ScriptDir & "\源数据", "*.txt", 1)

Dim $idRecords
_FileReadToArray("ID.txt", $idRecords)

If FileExists("findout.txt") Then FileDelete("findout.txt")
$result_file = FileOpen("findout.txt", 1)

For $i = 1 To $filelist[0]

        $file = FileOpen(@ScriptDir & "\源数据\" & $filelist[$i], 0)
        While 1
                $line = FileReadLine($file)
                If @error = -1 Then ExitLoop

                For $x = 1 To $idRecords[0]
                        If StringRegExp($line, $idRecords[$x], 0) == 1 Then
                                FileWriteLine($result_file, $line)
                        EndIf
                Next
        WEnd
        FileClose($file)

Next
FileClose($result_file)

试试看这个的效果如何。

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-10-4 18:16:56 | 显示全部楼层
本帖最后由 touch_xu 于 2010-10-4 18:20 编辑

回复 11# xianhou






十分感谢,这个可以,速度也好,能不能帮做成这样不用指定文件夹,可以选择路径,findout的结果也可时显示在列表中,这样等的时候感觉不无聊,谢谢xianhou ,已经可以了如果能帮加上GUI就更感谢了!

本帖子中包含更多资源

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

×
发表于 2010-10-4 18:27:28 | 显示全部楼层
你自己一点也不动手?
发表于 2010-10-4 22:23:41 | 显示全部楼层
批处理解密如下看看这个合不合用
3mile 发表于 2010-10-4 09:13



    这个bat怎么解密啊
发表于 2010-10-5 07:16:33 | 显示全部楼层
回复 14# liufenglg




    用一些其他的编辑器打开,比如 tc,ue 等,把文件前面部分的 %%a 去掉即可。
 楼主| 发表于 2010-10-5 09:19:18 | 显示全部楼层
本帖最后由 touch_xu 于 2010-10-5 09:23 编辑

虽然这个问题已经解决,我还想说一下,今天我用800M的数据源做实验,同样的环境,结果还bat的速度快,真的不知道为什么。bat只用了3分37秒,但是au3的却用了6分钟多。

下面是我修改的代码:
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=C:\WINDOWS\system32\SHELL32.dll|-23
#AutoIt3Wrapper_outfile=Record Finder.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Comment=Record Finder
#AutoIt3Wrapper_Res_Fileversion=1.1.0.0
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
Break(0)

#include <array.au3>
#include <file.au3>

If Not FileExists(@ScriptDir & "\DATA") Or Not FileExists(@ScriptDir & "\ID.txt") Then
        Msgbox(48, "没有相关文件程序退出!", "请把数据放入data文件夹!" & @CRLF & "本工具 ID DATA放入同一级目录!",5)
        Exit
Else
        TrayTip("提示:", @CRLF & "查找正在进行,请等待!" & @CRLF, 5, 1)
        sleep(1000)

        If FileExists("findout.txt") Then FileDelete("findout.txt")

        $filelist = _FileListToArray(@ScriptDir & "\DATA", "*.txt", 1)

        Dim $idRecords
        _FileReadToArray("ID.txt", $idRecords)


        $result_file = FileOpen("findout.txt", 1)

        For $i = 1 To $filelist[0]

                $file = FileOpen(@ScriptDir & "\DATA" & $filelist[$i], 0)
                While 1
                        $line = FileReadLine($file)
                        If @error = -1 Then ExitLoop

                        For $x = 1 To $idRecords[0]
                                If StringRegExp($line, $idRecords[$x], 0) == 1 Then
                                        FileWriteLine($result_file, $line)
                                EndIf
                        Next
                WEnd
                FileClose($file)

        Next
        FileClose($result_file)

        If FileGetSize(@ScriptDir & "\findout.txt") <> 0 Then
                ShellExecute("findout.txt")
                TrayTip("提示:", @CRLF & "查找成功完成!" & @CRLF, 5, 1)
                sleep(1000)
        Else
                FileDelete(@ScriptDir & "\findout.txt")
                TrayTip("提示:", @CRLF & "很遗憾没有找到一条记录!" & @CRLF, 5, 1)
                sleep(2500)
        Endif

Endif
请高手看看是什么原因。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 17:53 , Processed in 0.129714 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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