1 (изменено: Drusik, 2015-07-04 11:12:12)

Тема: Скрипт-фильтр текстового log-файла [SA:MP]

Доброго времени суток уважаемые форумчане. Обращаюсь к вам за помощью так как самостоятельно уже не могу решить свою проблему.
Постараюсь объяснить как можно понятнее(Подобные темы уже были на форуме).

Мне необходимо из текстового файла "chatlog.txt" вывести в чат игры определенную информацию.
К примеру я ввожу в чат команду "/id 777" после этого я получаю такой результат "[04:21:57]  Vasa_Pupkin [777]"

[04:21:57] - Время на ПК
Vasa_Pupkin - Ник игрока
[777] - ID игрока

Так вот, после того как я введя id получаю его ник, и к примеру сочетанием клавиши Alt+1 (Просто к примеру) мне нужно что бы AHK нашел в текстовом файле эту информацию и вывел мне в чат игры только часть результата "Pupkin". Выводить нужно самый последний результат из файла chatlog.txt

На практике должно быть как-то так:
1. Нажал сочетание клавиш Alt+1
2. В чате получить команду /id (Ид может быть от 0 до 999)
3. После начатия Enter получить в чате необходимую мне информацию

Нашел пример такого скрипта:

#IfWinActive GTA:SA:MP
SLES := 0
suspectid := 0
suspectname := "Подозреваемый"
suspectid1 := 0
suspectname1 := "Подозреваемый"
path := "C:\Documents and Settings\Администратор\Мои документы\GTA San Andreas User Files\SAMP\"
F3::
{
SLES := 1
suspectid := 0
suspectname := "Подозреваемый"
suspectid1 := 0
suspectname1 := "Подозреваемый"
sleep 1000
}
Return


!1::
FileDelete, %A_MyDocuments%%path%suspect.txt
sleep 50
Loop
{
Loop, read, %A_MyDocuments%%path%chatlog.txt, %A_MyDocuments%%path%suspect.txt
{
    IfInString, A_LoopReadLine, ] Ник{ffffff} , FileAppend, %A_LoopReadLine%`n
}
Loop, read, %A_MyDocuments%%path%suspect.txt
{
    RegExMatch(A_LoopReadLine, "] Вопрос от{ffffff} (.*) {33aa33}ID {ffffff}", suspectname)
    RegExMatch(A_LoopReadLine, " {33aa33}ID {ffffff}(.*)", suspectid)
}
sendinput {f6}/answ %suspectid% Здравствуйте, %suspectname% , решение вашей проблемы: {scape}
return
}

Только вот как его правильно переделать?

Пример записей из файла chatlog.txt


[09:57:05]  Объявление: [LS News] В 10:10 пройдёт эфир "Прятки" приз 150.000. Прислал: Pechenka_Big. Тел: 77777

[09:57:05]         Отредактировал сотрудник LS News: Pechenka_Big

[09:58:20]  Администратор: Zloy_Admin забанил Rodrigo. Причина: cheat

[09:58:28]  Primer_Name [190]

Надеюсь вы поймете что я хочу получить от AHK. И рассчитываю на ваши помощь.

P.S. Ув. Модераторы, если тему оформил не правильно, прошу сразу простить и указать на ошибку.

2

Re: Скрипт-фильтр текстового log-файла [SA:MP]

path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"  ; Путь к chatlog


!1:: ; alt +1    
Loop, read, %path_log% ; читаем последнюю строку.
    RegExMatch(A_LoopReadLine,"\[(.*)\]  (.*) \[(.*)\]", end_str)

; В переменной end_str без цифр будет хранится вся строка.
; С цифрой 1 только дата.
; С цифрой 2 только ник в игре
; С цифрой 3 только id
; Если строка по шаблону не найдена, в переменной будет 0
msgbox % end_str1 "`n" end_str2 "`n" end_str3

3 (изменено: Drusik, 2015-07-04 18:58:51)

Re: Скрипт-фильтр текстового log-файла [SA:MP]

yalanne пишет:
path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"  ; Путь к chatlog


!1:: ; alt +1    
Loop, read, %path_log% ; читаем последнюю строку.
    RegExMatch(A_LoopReadLine,"\[(.*)\]  (.*) \[(.*)\]", end_str)

; В переменной end_str без цифр будет хранится вся строка.
; С цифрой 1 только дата.
; С цифрой 2 только ник в игре
; С цифрой 3 только id
; Если строка по шаблону не найдена, в переменной будет 0
msgbox % end_str1 "`n" end_str2 "`n" end_str3

Спасибо большое, только вот я немного ошибся, и завел вас в заблуждение. Необходимо читать не последнюю строчку, а получается пред пред последнюю

Вот пример:


151: [17:41:30]  Player_Name [132]
152:
153:

Получается что в конце файлы "chatlog.txt" идет еще две пустых строки.
Как это можно исправит. Лучше вообще сделать поиск результата "[17:41:30]  Player_Name [132]" по всему файлу начиная с его конца, а не чтение последней строчки в "chatlog.txt"

Заранее благодарю за помощь. Пока жду ответа, постараюсь разобраться сам.

Забыл сказать что сам скрипт работает на отлично. Проверил просто запихнув результат "[17:41:30]  Player_Name [132]" в самый конец в ручную.

P.S. Есть ли возможность вывести результат "end_str2" без нижней черты "_"? Что бы в итоге выводилось просто "Player Name" а не "Player_Name".

4

Re: Скрипт-фильтр текстового log-файла [SA:MP]

С результатом "end_str2" разобрался, сделал так

RegExMatch(A_LoopReadLine,"\[(.*)\]  (.*)_(.*) \[(.*)\]", end_str)

Вопрос про чтение файла остается открытым.

5 (изменено: yalanne, 2015-07-04 19:29:23)

Re: Скрипт-фильтр текстового log-файла [SA:MP]

path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"  ; Путь к chatlog
log := {str:"",num:0}    ,    log.str := []

Loop, read, %path_log%
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

msgbox % log.str[log.num - 1 ]

RegExMatch(log.str[log.num - 1 ]
    ,"\[(.*)\]  (.*)_(.*) \[(.*)\]"
    , end_str)
    
msgbox % end_str1

Вот тут в квадратных скобках надо указывать номер нужной строки log.str[  ]
А в log.num хранится общее количество строк. там вычитается 1

6

Re: Скрипт-фильтр текстового log-файла [SA:MP]

Вот, теперь он читает то что мне нужно, огромное спасибо.

Вот конечный результат кода если кому пригодиться:

path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"  ; Путь к chatlog

!1:: ; alt +1 
log := {str:"",num:0}    ,    log.str := []

Loop, read, %path_log%
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

RegExMatch(log.str[log.num - 1 ]
    ,"\[(.*)\]  (.*)_(.*) \[(.*)\]"
    , end_str)

; В переменной end_str без цифр будет хранится вся строка.
; С цифрой 1 Дата
; С цифрой 2 Имя
; С цифрой 3 Фамилия
; С цифрой 4 ID
; Если строка по шаблону не найдена, в переменной будет 0
; msgbox % end_str1 "`n" end_str2 " " end_str3 "`n" end_str4
sendinput {f6}Привет %end_str3%{space}
return

yalanne огромное спасибо вам за вашу помощь.

7 (изменено: Drusik, 2015-07-08 19:20:08)

Re: Скрипт-фильтр текстового log-файла [SA:MP]

Вот еще такой вопрос появился, как сделать так что бы строка

RegExMatch(log.str[log.num - 1 ]
    ,"\[(.*)\]  (.*)_(.*) \[(.*)\]"
    , end_str)

искала результат среди последних 10-ти строк файла, при этом поиск начинался бы с конца файла и заканчивался как только найдет нужный мне результат.

8

Re: Скрипт-фильтр текстового log-файла [SA:MP]

Точно не знаю какова задача, но при работе с обновляемыми логами используется обычно иной подход, когда каждое нажатие клавиши подразумевает, что поиск производится только по новому содержимому лога, тому что появилось после предыдущего нажатия. Если это так, могу написать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: Скрипт-фильтр текстового log-файла [SA:MP]

serzh82saratov пишет:

Точно не знаю какова задача, но при работе с обновляемыми логами используется обычно иной подход, когда каждое нажатие клавиши подразумевает, что поиск производится только по новому содержимому лога, тому что появилось после предыдущего нажатия. Если это так, могу написать.

У меня с работой вышеуказаных скриптов проблем нет. Только та, что ищет результат в самой последней строке в файле, а мне нужно что бы искало результат среди 10-ти последних строк.

10 (изменено: yalanne, 2015-07-08 19:57:11)

Re: Скрипт-фильтр текстового log-файла [SA:MP]

path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"  ; Путь к chatlog

log := {str:"",find:0,num:0}    ,    log.str := []

Loop, read, %path_log%
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

loop 10
    if RegExMatch(     log.str[log.num + 1 - A_Index]
        ,"\[(.*)\]  (.*)_(.*) \[(.*)\]"
        , end_str) and (log.find:=log.num + 1 - A_Index)
            break
        
msgbox % "Номер строки:`t" log.find "`nСтрока:`t`t" end_str "`nДата:`t`t" end_str1 "`nИмя:`t`t" end_str2 "`nФамилия:`t`t" end_str3 "`nID:`t`t" end_str4

Ищет по шаблону "\[(.*)\]  (.*)_(.*) \[(.*)\]".

11

Re: Скрипт-фильтр текстового log-файла [SA:MP]

У меня с работой вышеуказаных скриптов проблем нет.

Я и не говорил, что они должны быть. Просто судя потому что сначала надо было 3 строку с конца, потом из последних 10, сделал вывод:

что поиск производится только по новому содержимому лога, тому что появилось после предыдущего нажатия

если так, то наверное не всегда нужное может оказаться именно в той десятке.
Да и лог ведь со временем работы растёт, каждый раз целиком заносить его в массив наверное не лучший вариант.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: Скрипт-фильтр текстового log-файла [SA:MP]

yalanne пишет:
path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"  ; Путь к chatlog

log := {str:"",find:0,num:0}    ,    log.str := []

Loop, read, %path_log%
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

loop 10
    if RegExMatch(     log.str[log.num + 1 - A_Index]
        ,"\[(.*)\]  (.*)_(.*) \[(.*)\]"
        , end_str) and (log.find:=log.num + 1 - A_Index)
            break
        
msgbox % "Номер строки:`t" log.find "`nСтрока:`t`t" end_str "`nДата:`t`t" end_str1 "`nИмя:`t`t" end_str2 "`nФамилия:`t`t" end_str3 "`nID:`t`t" end_str4

Ищет по шаблону "\[(.*)\]  (.*)_(.*) \[(.*)\]".


Спасибо, то что нужно)

13 (изменено: yalanne, 2015-07-08 22:29:52)

Re: Скрипт-фильтр текстового log-файла [SA:MP]

serzh82saratov, Ну можно сделать авто-удаление log'а через каждые 10 и боле строк. что бы не засорять все жирным массивом.

14

Re: Скрипт-фильтр текстового log-файла [SA:MP]

Просто была как то у товарища подобная задача, и там была ещё вторая кнопочка, которая искала по всему логу, да и файл должен был оставатся. Ну а удалить, это да, дело нехитрое.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui