PDA

Показать полную графическую версию : [решено] Чтение строк из лога и запись их в файл


support23
23-08-2012, 13:12
Добрый день!
Есть необходимость прочитать N последних строк из файла (например log.txt)
и записать эти строки в файл (например task.txt)
вот что получилось, но скрипт работает корректно только с 5 последними строками, что нужно изменить чтобы увеличить кол-во обрабатываемых строк?


#include <FileConstants.au3>
$Pos = 1000
$space = "-----------------------------"
$hFile = FileOpen(@ScriptDir & '\log.txt')

FileSetPos($hFile, -196, $file_end)
$sText = FileRead($hFile)
FileClose($hFile)

For $i = 1 To 5
$string = _ReadString($Pos, $i)
FileWrite(@ScriptDir & "\task.txt", $string & @CRLF)
ClipPut($string)
Next

Func _ReadString(ByRef $Pos, $i)
$TmpPos = StringInStr($sText, @CRLF, 0, -$i)
$string = StringMid($sText, $TmpPos + 2, $Pos - $TmpPos - 2)
$Pos = $TmpPos
Return $string
EndFunc

madmasles
23-08-2012, 19:52
support23,
Попробуйте так.#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <Array.au3>

Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aError[5] = ['Успех', 'Не существует файла:', 'Пустой файл:', 'Ошибка открытия файла:', 'Ошибка чтения файла:']
$sFile = @ScriptFullPath (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptfullpath)
;$sFile = @ScriptDir & '\1.txt'
$iCount = Random (http://www.autoitscript.com/autoit3/docs/functions/Random.htm)(5, 15, 1)
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)($iCount & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf))

$aLast = _FileReadLastLine($sFile, $iCount)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(16, 'Error', $aError[@error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error)] & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf) & $sFile)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
_ArrayDisplay (http://www.autoitscript.com/autoit3/docs/libfunctions/_arraydisplay.htm)($aLast, $aError[@error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error)])
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _FileReadLastLine($s_File, $i_LastCount)
;$s_File - полный путь к файлу
;$i_LastCount - количество возвращаемых с конца строк
;Вернет массив $a_Ret с $i_LastCount последними строками, $a_Ret[0] = $i_LastCount
;пустые строки удаляются.
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $h_File, $i_Size, $s_Text, $aTemp, $i_Pos, $f_ExitLoop, $i_Start = 2, $a_Text, $a_Ret[2]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) FileExists (http://www.autoitscript.com/autoit3/docs/functions/FileExists.htm)($s_File) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, '')
$i_Size = FileGetSize (http://www.autoitscript.com/autoit3/docs/functions/FileGetSize.htm)($s_File)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $i_Size Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(2, 0, '')
$h_File = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($s_File, 0)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $h_File = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(3, 0, '')
$i_Pos = $i_LastCount + 1
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$s_Text = ''
FileSetPos (http://www.autoitscript.com/autoit3/docs/functions/FileSetPos.htm)($h_File, -$i_Pos, 2)
$s_Text = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($h_File)
$s_Text = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)(StringStripCR (http://www.autoitscript.com/autoit3/docs/functions/StringStripCR.htm)($s_Text), '([\n]+$)', '')
$s_Text = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($s_Text, '(\n){2,}', '$1')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $f_ExitLoop Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
StringReplace (http://www.autoitscript.com/autoit3/docs/functions/StringReplace.htm)($s_Text, @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf), '')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @extended (http://www.autoitscript.com/autoit3/docs/macros.htm#@extended) >= $i_LastCount Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
$i_Pos += $i_LastCount + 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $i_Pos > $i_Size Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$f_ExitLoop = True (http://www.autoitscript.com/autoit3/docs/keywords.htm#True)
$i_Start = 1
$i_Pos = $i_Size
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($h_File)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $s_Text Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(4, 0, '')
$a_Text = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)($s_Text, @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf))
$s_Text = ''
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $a_Text[0] > 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $f_ExitLoop Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $a_Ret[$a_Text[0] + 1]
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $a_Ret[$a_Text[0]]
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = $i_Start To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $a_Text[0]
$a_Ret[0] += 1
$a_Ret[$a_Ret[0]] = StringStripWS (http://www.autoitscript.com/autoit3/docs/functions/StringStripWS.htm)($a_Text[$i], 7)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$a_Ret[0] = 1
$a_Ret[1] = StringStripWS (http://www.autoitscript.com/autoit3/docs/functions/StringStripWS.htm)($a_Text[1], 7)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $a_Ret
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc) ;==>_FileReadLastLine

support23
24-08-2012, 08:57
Не подскажите как сделать вывод строк в файл (сейчас отображаются в окне), и где в теле скрипта задается кол-во строк?

gora
05-10-2012, 13:16
support23, может так:#include <file.au3>

Local $aRecords
$i_LastCount = 5

If Not _FileReadToArray(@ScriptDir & '\log.txt', $aRecords) Then
MsgBox(4096, "Ошибка", "Ошибка " & @error & " чтения файла в массив")
Exit
EndIf
If $aRecords[0] <= $i_LastCount Then
MsgBox(4096, "Ошибка", "В файле всего " & $aRecords[0] & " строк(и)")
Exit
EndIf
_FileWriteFromArray(@ScriptDir & '\task.txt', $aRecords, $aRecords[0] - $i_LastCount + 1)
Exit

AZJIO
06-10-2012, 04:39
Вот ещё по теме (http://www.autoitscript.com/forum/topic/143295-filereadline-can-you-read-second-last-line/page__st__20#entry1009463)

support23, GUICtrlRead, FileWrite

support23
18-10-2012, 12:04
Спасибо всем за помощь! мне подошел вариант который предложил gora




© OSzone.net 2001-2012