2017-02-10 38 views
0

Я пытаюсь использовать AutoIt для извлечения текста из нескольких файлов журнала размером более 500 МБ, а текст, который нужно извлечь, находится в столбце excel. У меня проблемы с FileRead, которые вызывают ошибку в памяти. Я даже попробовал FileReadToArray, который, как я думал, облегчит функции для обработки огромной строки. Все файлы имеют размер около 7,8 ГБ. Самый большой файл размером около 800 МБ.Поиск текста в файлах журналов со входами из столбцов в excel

Global $aUserNames[] = _Excel_RangeRead($file,$Worksheet) ; Usernames need to be read from Excel 
Global $sFolderPath = FileSelectFolder("Select Folder", "") 
Global $aFileList = _FileListToArrayRec($sFolderPath, "*.*", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) 
If @error = 1 Then Exit MsgBox(0, "", "No Folders Found.") 
If @error = 4 Then Exit MsgBox(0, "", "No Files Found.") 

Local $sRegEx = "(?i)" 
For $i = 0 To UBound($aUserNames) - 1 
    $sRegEx &= "\b" & $aUserNames[$i] & "\b|" 
Next 
$sRegEx = StringTrimRight($sRegEx, 1) 

Global $Store 

For $i = 1 To $aFileList[0] 
    $sFileContent = _FileReadToArray($aFileList[$i],$Store) 
    If StringRegExp($sFileContent, $sRegEx) Then MsgBox(0, "Info", "One of more users found in file " & $aFileList[$i]) 
Next 

Этот код был поддержан jguinch на форуме AutoIt.

+0

Вы можете попробовать использовать версию окна или Grep из СЭД для поиска файлов с помощью регулярных выражений - https://sourceforge.net/projects/unxutils/?source=typ_redirect В противном случае, вам, вероятно, нужно прочитать записывает строку за раз – Richard

ответ

0

Вы можете прочитать файл по одной строке за раз, чтобы избежать проблемы с памятью.

For $i = 1 To $aFileList[0] 
    $fileHandle = FileOpen($aFileList[$i]) 
    While True 
     $fileLine = FileReadLine($fileHandle) 
     If @error Then Exitloop 
     If StringRegExp($fileLine , $sRegEx) Then MsgBox(0, "Info", "One of more users found in file " & $aFileList[$i]) 
    WEnd 

Next