Что нового

поиск в txt

  • Автор темы Bad_boy
  • Дата начала
B

Bad_boy

Гость
Всем привет. Недавно начал изучать эту программу, наткнулся на проблему.Ни как не выходит написать одну функцию... Суть состоит в следующем:
имееется текстовый файл типа(это чат логи):
пустота
пустота
---------------------------------------------------------------
[ 2009.09.09 время ] ник> опред текст
[ 2009.09.09 время ] ник> опред текст
со временем этих строчек становится все больше.
Из этого всего нужно получить вот примерно такой массив, чтобы в дальнейшем его можно было использовать в autoIT
[№ строки] [Дата, время] [ник] [опред текст]
Заранее спс
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Если попроще, то можно как то вот так:

Код:
Global $File, $Line, $Pos, $Data[5], $n = 0

$File = FileOpen('log.txt', 0)
If $File = -1 Then
    MsgBox(0, 'Error', 'Unable to open file.')
    Exit
EndIf
While 1
    $Line = FileReadLine($File)
    If @error Then
        ExitLoop
    EndIf
    $Line = StringStripWS($Line, 3)
    $n += 1
    If StringLeft($Line, 1) = '[' Then
        $Data[0] = $n
        $Line = StringStripWS(StringTrimLeft($Line, 1), 1)
        $Pos = StringInStr($Line, ' ')
        $Data[1] = StringLeft($Line, $Pos - 1)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, ']')
        $Data[2] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, '>')
        $Data[3] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Data[4] = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Line = '[' & $Data[0] & '] [' & $Data[1] & ', ' & $Data[2] & '] [' &$Data[3] & '] [' & $Data[4] & ']'
        MsgBox(0, '', $Line)
    EndIf
Wend
FileClose($File)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Вот так?

Код:
#include <Array.au3>

$sRead = ClipGet() ;Тут заменить на чтение файла

$aSplit = StringSplit(StringStripCR($sRead), @LF)
Dim $aNewArr[$aSplit[0]+1]

For $i = 1 To $aSplit[0]
	$sPattern = "\A\[ (\d{4}\.\d{2}\.\d{2}) (\d{2}:\d{2}:\d{2}) \] (.*?)> (.*?)$"
	If Not StringRegExp($aSplit[$i], $sPattern) Then ContinueLoop
	
	$aNewArr[0] += 1
	$aNewArr[$aNewArr[0]] = StringRegExpReplace($aSplit[$i], $sPattern, "[" & $aNewArr[0] & "] [\1, \2] [\3] [\4]")
Next

ReDim $aNewArr[$aNewArr[0]+1]
_ArrayDisplay($aNewArr)
 
Автор
B

Bad_boy

Гость
Тэкс, видать я не так описал задачу, или я не так понял что вы мне написали )
нужно сделать что-то типо подобного цикла
№строки=0
Do
1)№строки=№строки+1
2)Если строка начинается с "["(это первый символ в строчке) то присвоить "[....]" $Date, если начинается не с [ то начинать цикл заного
3)Если после $Data идет $nickname> то продолжать , если ника нету то делать цикл заного (никнэйм будет задан выше)
4)Если после $nickname идет какойнибудь текст то присвоить всему этому тексту $Text ,если текста нету то опятьже начинать цикл заного
5)$line=($1 $Date $nickname $text)
Делать цикл пока не закончим последнюю строчку

ЗЫ Для чего мне все это нужно ? Хочу сделать програмульку которой можно будет управлять чат , Она будет читать данные с этого массива .
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Bad_boy сказал(а):
Тэкс, видать я не так описал задачу, или я не так понял что вы мне написали )
нужно сделать что-то типо подобного цикла
№строки=0
Do
1)№строки=№строки+1
2)Если строка начинается с "["(это первый символ в строчке) то присвоить "[....]" $Date, если начинается не с [ то начинать цикл заного
3)Если после $Data идет $nickname> то продолжать , если ника нету то делать цикл заного (никнэйм будет задан выше)
4)Если после $nickname идет какойнибудь текст то присвоить всему этому тексту $Text ,если текста нету то опятьже начинать цикл заного
5)$line=($1 $Date $nickname $text)
Делать цикл пока не закончим последнюю строчку

ЗЫ Для чего мне все это нужно ? Хочу сделать програмульку которой можно будет управлять чат , Она будет читать данные с этого массива .

Собственно и я и CreatoR представили тебе именно то, о чем ты говоришь. Ты пробывал запускать эти примеры?
 
Автор
B

Bad_boy

Гость
Yashied , пробывал, почему то твоя программа нечего не выдает( хотя должна выдать:MsgBox(0, '', $Line)
У CreatoR программа выдает окошко но в нем нету никаких результатов ((
Ещё разок напишу то что есть
Код:
пустая строчка
пустая строчка
тут может быть всякий мусор
---------------------------------------------------------------
?[ 2009.09.09 13:45:20 ] Человек1 > привет
?[ 2009.09.09 13:45:43 ] Человек2 > здарова
?[ 2009.09.09 13:45:49 ] Человек1 > Как дела ?

?
И то что нужно получить
Код:
1 2009.09.09 13:45:20 Человек1 > привет
2 2009.09.09 13:45:43 Человек2 > здарова
3 2009.09.09 13:45:49 Человек1 > Как дела ?
Желательно както обьединить $Data[1] и $Data[2] в одну дату.
Изначально мне больше подходит код Yashied'a т.к он мне более понятен и нужно чтобы каждый элемент массива был отдельной переменной($Data[0-4])
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А ты пробывал менять название файла в программе (log.txt на название своего файла)?

;D

У меня все работает, здесь убрал только скобки "[]".

Код:
Global $File, $Line, $Pos, $Data[5], $n = 0

$File = FileOpen('log.txt', 0)
If $File = -1 Then
    MsgBox(0, 'Error', 'Unable to open file.')
    Exit
EndIf
While 1
    $Line = FileReadLine($File)
    If @error Then
        ExitLoop
    EndIf
    $Line = StringStripWS($Line, 3)
    $n += 1
    If StringLeft($Line, 1) = '[' Then
        $Data[0] = $n
        $Line = StringStripWS(StringTrimLeft($Line, 1), 1)
        $Pos = StringInStr($Line, ' ')
        $Data[1] = StringLeft($Line, $Pos - 1)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, ']')
        $Data[2] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, '>')
        $Data[3] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Data[4] = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Line = $Data[0] & ' ' & $Data[1] & ' ' & $Data[2] & ' ' &$Data[3] & ' > ' & $Data[4]
        MsgBox(0, '', $Line)
    EndIf
Wend
FileClose($File)
 
Автор
B

Bad_boy

Гость
конечно менял )) иначе бы он начал ругатся что не может найти файл...
зы, оч странно, если MsgBox вставить после endif то оно начинает работать, но выдает все подрят а не то что описано в IF
Вот прикрепляю файл txt, проверьте,с ним скрипт норм работает ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
У тебя первый символ в строке не "[", а символ с кодом 65279. Это так должно быть?
 
Автор
B

Bad_boy

Гость
Хм, ну если его открывать в блокноте или в опере то первый знак строки ([) ...вот прям сейчас копирнул...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Советую Notepad2. Отличная замена стандартному блокноту. В нем ты увидешь этот символ.
 
Автор
B

Bad_boy

Гость
выяснились новые обстоятельства )
вид такой
Код:
---------------------------------------------------------------

  ID канала:      2114079175
  Имя канала:    hello
  Ник:        Bad_boy
  Session started: 2009.09.09 13:45:03
---------------------------------------------------------------

?[ 2009.09.09 13:45:05 ] Топик канала > Бла бла бла
?[ 2009.09.09 13:45:20 ] юзер1 > привет
?[ 2009.09.09 13:45:43 ] юзер2 > здарова
?[ 2009.09.09 13:45:49 ] юзер1 > как дела ?
Без этого блокнота2 я бы даже не узнал что строчки там таким образом расположены )
ps Когда открыл файл в этом блокноте то все как было так и осталось... ни какого символа 65279 там вроде нету ) обычная скобка
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Запусти это.

Код:
$File = FileOpen('test.txt', 0)
$Line = FileReadLine($File, 7)
FileClose($File)
ConsoleWrite('Строка - ' & $Line & @CR)
ConsoleWrite('Первый символ - "' & StringLeft($Line, 1) & '"' & @CR)
ConsoleWrite('Код - ' & AscW(StringLeft($Line, 1)) & @CR)
$Line = StringTrimLeft($Line, 1)
ConsoleWrite('Второй символ - "' & StringLeft($Line, 1) & '"' & @CR)
ConsoleWrite('Код - ' & AscW(StringLeft($Line, 1)) & @CR)
 
Автор
B

Bad_boy

Гость
хм ,действительно ... и как лечится? If StringLeft($Line, 1) = '?' Then не помогает, If StringLeft($Line, 1) = '?[' Then тоже...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Какой-то стремный у тебя файл, вот попробуй это.

Код:
Global $File, $Line, $Pos, $Data[5], $n = 0

$File = FileOpen('test.txt', 0)
If $File = -1 Then
    MsgBox(0, 'Error', 'Unable to open file.')
    Exit
EndIf
While 1
    $Line = FileReadLine($File)
    If @error Then
        ExitLoop
    EndIf
    $Line = StringStripWS($Line, 3)
    $n += 1
    If (AscW(StringLeft($Line, 1)) = 65279) And (StringLeft(StringTrimLeft($Line, 1), 1) = '[') Then
        $Data[0] = $n
        $Line = StringTrimLeft($Line, 2)
        $Pos = StringInStr($Line, ' ')
        $Data[1] = StringLeft($Line, $Pos - 1)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, ']')
        $Data[2] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, '>')
        $Data[3] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Data[4] = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Line = $Data[0] & ' ' & $Data[1] & ' ' & $Data[2] & ' ' & $Data[3] & ' > ' & $Data[4]
        MsgBox(0, '', $Line)
    EndIf
WEnd
FileClose($File)
 
Автор
B

Bad_boy

Гость
Спс большое , сам бы я такое не сделал , теперь вроде все норм !
 
Автор
B

Bad_boy

Гость
Не подскажите как можно удалить строчку которую он прошел ? а ещё лучше както её помечать чтобы скрипт заного не проходил одни и теже строчки ?
Вот что имею на данный момент
Код:
TxtRead()
Func TxtRead()
Global $File, $Line, $Pos, $Data[5], $n = 0,$i=0,$nickname
 
$File = FileOpen('123.txt', 0)
$nickname=IniRead("nickname.ini","nick","nick","default") ;Ищем ключ nick  в nickname.ini , в секции nick
$sys1=IniRead("nickname.ini","Core","1","default")
$sys2=IniRead("nickname.ini","Core","2","default")
If $File = -1 Then
    MsgBox(0, '', 'Файла нет')
    Exit
EndIf
While 1
    $Line = FileReadLine($File)
    If @error Then
        ExitLoop
    EndIf
    $Line = StringStripWS($Line, 3)
    $n += 1
    If (AscW(StringLeft($Line, 1)) = 65279) And (StringLeft(StringTrimLeft($Line, 1), 1) = '[') Then
		$i=$i+1
        $Data[0] = $i
        $Line = StringTrimLeft($Line, 2)
        $Pos = StringInStr($Line, ' ')
        $Data[1] = StringLeft($Line, $Pos - 1)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, ']')
        $Data[2] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Line = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Pos = StringInStr($Line, '>')
        $Data[3] = StringStripWS(StringLeft($Line, $Pos - 1), 2)
        $Data[4] = StringStripWS(StringTrimLeft($Line, $Pos), 1)
        $Line = $Data[0] & ' ' & $Data[1] & ' ' & $Data[2] & ' ' & $Data[3] & ' > ' & $Data[4]
		
       $CheckNick=StringRegExp($Data[3],$nickname,0) ;проверка ника
If $CheckNick=1 then ;Если ник совпадает с $nickname то
	$sy1=StringRegExp($Data[4],$sys1,0)
	$sy2=StringRegExp($Data[4],$sys2,0)
	;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	If $sy1=1 And $Sy2=0 then 
		MsgBox(0, '', 'Действие 1')
	EndIf
    If  $sy2=1 And $sy1=0  Then
		MsgBox(0, '', 'Действие 2')
	EndIf
	If  $sy1=1 And $sy2=1  Then
		MsgBox(0, '', 'Действие 3')
	EndIf
	;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EndIf
  
    EndIf
WEnd
FileClose($File)
EndFunc

Перед скриптом(который выше) будет запускатся вот такая функция
Код:
CheckSize ()
Func CheckSize ()
$size1 = FileGetSize("123.txt")
Do
$size2 = FileGetSize("123.txt")
Until $size2 > $size1 
EndFunc

Как только изменился размер файла то запускается первый скрипт
 
Автор
B

Bad_boy

Гость
Re: поиск в txt

ни у кого идей нету ? Тут проблема в том что TxtRead() не работает постоянно (( Мб к каждой проделанной строчке подписывать какойлибо знак ? Тогда мне кажется будет проще
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Ну может не к каждой, а к последней в текущей сессии. Но уникальное чтото, чтоб не встречалось в текстах самого чата. Потом находить эту уникальную метку, определять в какой она строке находится, удалять её, переходить на следующую строку, и начать обработку текста, по окончании опять поставить метку.
Что-то типа этого мне видится, извини без примеров только теория.
 
Верх