▶▶肯求快速找记录的方法(感谢xianhou 已解决)
本帖最后由 touch_xu 于 2010-10-4 18:25 编辑我要从800多个txt文件(插图1)中找包含指定字符串的记录行(插图2),这此txt未压缩前有400M之大,每个文件都有数千条记录(插图3)。通常我们用一个FindoutRAWdata.bat(有附件,但是加密了)从给定查找字条串的文件中(ID.txt 插图2)查找但是这样很慢,我知道AU3会强大的多一定会快很多倍,但是小弟不才不出一行代码来,所以肯请各位高人帮帮忙。如果给帮做个GUI的在上面显示一下结果,然后保存一下就更好了,多谢了。 你要求工具返回的值是 文件名呢还是包含了指定字符串的记录行还是什么呢? 你可以说下你现在的这个工具的工作原理不呢?是打开每一个TXT文件 然后找包含的字符串,对吗? 本帖最后由 touch_xu 于 2010-10-4 08:04 编辑
回复 3# chenxu7601257
这个bat也不是我做的,内容加密了,我也不知道。
我想要的返回结果就是.如果其中一个txt中有要找的内容,就把所在的行的全部内容写入一个新的txt中。找到多个结果也放在同一个txt中重复的也保留,谢谢了。
附件是一个示例,我用1 2 3.txt 代表我要找的文件,ID.txt代表我要的指定内容,运行FindoutRAWdata.bat后返回的结果在findout.txt中。 本帖最后由 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
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 本帖最后由 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再帮助改一下啊! cls
@echo off
for %%j in (源数据\*.txt) do (for /f %%i in (条件数据\ID.txt) do @findstr "%%i" %%j >> 目标数据\findout.txt)
如果新建一个这样的 bat 文件,速度会不会快一些?
建立 3 个子目录,存放不同的 txt 文件。 本帖最后由 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)
这样方便一些,我要的就是速度快,不太想用批处理的,请大侠们再帮改一下。 我想 au3 不会比 bat 更快。 #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
$file = FileOpen(@ScriptDir & "\源数据\" & $filelist[$i], 0)
While 1
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
For $x = 1 To $idRecords
If StringRegExp($line, $idRecords[$x], 0) == 1 Then
FileWriteLine($result_file, $line)
EndIf
Next
WEnd
FileClose($file)
Next
FileClose($result_file)
试试看这个的效果如何。 本帖最后由 touch_xu 于 2010-10-4 18:20 编辑
回复 11# xianhou
十分感谢,这个可以,速度也好,能不能帮做成这样不用指定文件夹,可以选择路径,findout的结果也可时显示在列表中,这样等的时候感觉不无聊,谢谢xianhou ,已经可以了如果能帮加上GUI就更感谢了! 你自己一点也不动手? 批处理解密如下看看这个合不合用
3mile 发表于 2010-10-4 09:13 http://www.autoitx.com/images/common/back.gif
这个bat怎么解密啊 回复 14# liufenglg
用一些其他的编辑器打开,比如 tc,ue 等,把文件前面部分的 %%a 去掉即可。 本帖最后由 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
$file = FileOpen(@ScriptDir & "\DATA\" & $filelist[$i], 0)
While 1
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
For $x = 1 To $idRecords
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请高手看看是什么原因。
页:
[1]
2