Что нового

Копирование определенных строк в txt файле

marmisha

Новичок
Сообщения
41
Репутация
2
Здравствуйте. Прошу помощи так как сам не знаю с чего начать. Имеется текстовый файл с содержанием такого типа:

Trying Account: istr Password: q1w2e3r4t5
Login Fail: (Wrong Password)
Trying Account: istral23 Password: 240439
Login Fail: (Wrong Password)
Trying Account: istule Password: 620296
Login Fail: (Wrong Password)
Trying Account: isuas Password: 23223222
Login Fail: (0x04)
Trying Account: isuas Password: 23223222
Login Fail: (Wrong Password)
Trying Account: isuss Password: 35434040
Login Fail: (Wrong Password)
Trying Account: isys Password: cjcbxkty
Login Fail: (0x04)
Trying Account: ita1997chi Password: 9,51753E+11
Login Fail: (Wrong Password)
Trying Account: itachi237 Password: artemka
Login Fail: (Wrong Password)
Trying Account: itachi5122 Password: ronaldinho
Login Fail: (Wrong Password)
Trying Account: itachi Password: 1997
Login Fail: (Wrong Password)
Trying Account: itallourlive Password: 3553370
Login Fail: (Wrong Password)
Trying Account: itallourlive Password: neizer
Login Fail: (Wrong Password)
Trying Account: itcc Password: 2344523
Login Fail: (0x04)
Trying Account: itcv Password: 123456bogdan
Login Fail: (Wrong Password)
Trying Account: itdxtyrjd Password: 19031992
Login Fail: (0x04)

Нужен скрипт для поиска и копирование всей предыдущей строчки перед строкой Login Fail: (0x04), т.е.
Trying Account: itdxtyrjd Password: 19031992
Login Fail: (0x04)
нужна строка Trying Account: itdxtyrjd Password: 19031992
Желательно, чтобы результат записывался в новый текстовый файл.
Заранее благодарен.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
что-то типа этого
Код:
$sTxtFile = @ScriptDir & "\txtfile.txt" ; это исходный файл со строками
$sNewTxtFile = @ScriptDir & "\NEW_txtfile.txt" ; это ноый файл с паролями

$hTxtFile = FileOpen ($sTxtFile, 0) ; открываем файл для чтения
$sFullText = FileRead ($hTxtFile) ; читаем файл целиком
FileClose ($hTxtFile)
$aFullText = StringSplit ($sFullText, @CRLF, 1) ; разбиваем строки на массив
$sFullText = "" ; создаём переменную для результата
For $i=1 To $aFullText[0] Step 2 ; в цикле вынимает строки через одну
	$sFullText &= $aFullText[$i] & @CRLF
Next
$hNewTxtFile= FileOpen ($sNewTxtFile, 1) ; открываем файл для записи в конец
FileWrite ($hNewTxtFile, $sFullText) ; записываем результат
Fileclose ($hNewTxtFile)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
marmisha
Попробуйте так:
Код:
#include <File.au3>

Dim $aTemp ;временный массив для текста файла
Dim $aText[1] ;массив для результата
$sText = 'Login Fail:  (0x04)';тестовая строка, которую будем искать
$sFile = 'log.log';файл для поиска
$sFileNew = 'Test.txt';файл для результата
$j = 0 ;индекс размера массива для результата

_FileReadToArray($sFile, $aTemp);читаем файл во временный массив

For $i = 1 To $aTemp[0];в цикле столько раз, сколько строк в файле
	If StringInStr($aTemp[$i], $sText) Then; проверяем наличие тестовой строки
		$j += 1 ;если есть, увеличиваем инлекс на 1
		ReDim $aText[$j + 1] ;увеличиваем размер массива
		$aText[$j] = $aTemp[$i - 1] ;помещаем в массив строку, предыдущую тестовой
	EndIf
Next
$aText[0] = ' Найдено строк: ' & $j ;первому элементу массива присваиваем это значение
_FileWriteFromArray($sFileNew, $aText) ;записываем массив в файл для результата

ynbIpb,
Не все четные строки равны Login Fail: (0x04), а, как я понял, выбрать надо только строки над Login Fail: (0x04).
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Блин точно, не заметил условия.
Тогда так (только не допускать, чтобы строка "Login Fail: (0x04)" была первой, а то не корректно отработает):
Код:
$sTxtFile = @ScriptDir & "\txtfile.txt" ; это исходный файл со строками
$sNewTxtFile = @ScriptDir & "\NEW_txtfile.txt" ; это ноый файл с паролями

$hTxtFile = FileOpen ($sTxtFile, 0) ; открываем файл для чтения
$sFullText = FileRead ($hTxtFile) ; читаем файл целиком
FileClose ($hTxtFile)
$aFullText = StringSplit ($sFullText, @CRLF, 1) ; разбиваем строки на массив
$sFullText = "" ; создаём переменную для результата
For $i=1 To $aFullText[0]; в цикле приверяем строки по одной
	If $aFullText[$i] = "Login Fail:  (0x04)" Then ; если текущая строка (0x04) то
		$sFullText &= $aFullText[$i-1] & @CRLF ;Заносим в переменную предыдущую
	EndIf
Next
$hNewTxtFile= FileOpen ($sNewTxtFile, 1) ; открываем файл для записи в конец
FileWrite ($hNewTxtFile, $sFullText) ; записываем результат
Fileclose ($hNewTxtFile)
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
тогда предварительно вырезать @CR
$sFullText = StringStripCR ($sFullText)
$aFullText = StringSplit ($sFullText, @LF)
 
Автор
M

marmisha

Новичок
Сообщения
41
Репутация
2
Спасибо за оперативность, но все-таки, какой конечный вариант, как скрипт должен выглядеть в правильном варианте?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
marmisha [?]
какой конечный вариант, как скрипт должен выглядеть в правильном варианте?
В принципе, оба варианта делают одно и то же, так что, хозяин - барин, выбирайте, какой Вам больше нравится. :smile:
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Если размер текстового файла позволяет ,то проще так :
Код:
#Include<Array.au3>;******Добавлено
#Include<File.au3>;*****Добавлено
$sText=FileRead(@scriptDir & "\Test.txt")
$Login="0x04";              1-Логин для поиска
;$Login="Wrong Password"  ; 2-Логин для поиска

$sPattern="(.+?\r\n)Login Fail:\s+?\Q(" & $Login & ")\E.+?"
$aRez=StringRegExp($sText,$sPattern,3)
_ArrayDisplay($aRez,'$aRez')
$hFile = FileOpen(@scriptDir & "\Test1.txt", 1) ; 1 = append
_FileWriteFromArray($hFile, $aRez)
FileClose($hFile)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz
У меня Ваш вариант не работает. Только создает пустой файл Test1.txt.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles сказал(а):
gregaz
У меня Ваш вариант не работает. Только создает пустой файл Test1.txt.

Конечно забыл объявить :
Код:
#Include<Array.au3>
#Include<File.au3>

Исправил наверху
 
Автор
M

marmisha

Новичок
Сообщения
41
Репутация
2
Что-то я окончательно запутался. Вот что я натворил:
Код:
$sTxtFile = @ScriptDir & "C:\Documents and Settings\Саша\Рабочий стол\скрипт 0x04\Brute.txt" ; это исходный файл со строками
$sNewTxtFile = @ScriptDir & "C:\Documents and Settings\Саша\Рабочий стол\скрипт 0x04\NEW_txtfile.txt" ; это ноый файл с паролями

$hTxtFile = FileOpen ($sTxtFile, 0) ; открываем файл для чтения
$sFullText = FileRead ($hTxtFile) ; читаем файл целиком
FileClose ($hTxtFile)
$aFullText = StringSplit ($sFullText, @CRLF, 1) ; разбиваем строки на массив
$sFullText = "" ; создаём переменную для результата
For $i=1 To $aFullText[0]; в цикле приверяем строки по одной
    If $aFullText[$i] = "Login Fail:  (0x04)" Then ; если текущая строка (0x04) то
        $sFullText &= $aFullText[$i-1] & @CRLF ;Заносим в переменную предыдущую
    EndIf
Next
$hNewTxtFile= FileOpen ($sNewTxtFile, 1) ; открываем файл для записи в конец
FileWrite ($hNewTxtFile, $sFullText) ; записываем результат
Fileclose ($hNewTxtFile)

Почему не работает? Что не так?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
marmisha [?]
Почему не работает? Что не так?

Поставь после :
Код:
$aFullText ..........
Код:
_ArrayDisplay($aFullText)

Чтобы увидеть а получил ли массив ?
Затем поставь после
Код:
Next
Код:
MsgBox(0,'$sFullText',$sFullText)

Увидишь а есть строки для записи
и т.д.




Добавлено:
Сообщение автоматически объединено:

Обрамляй код тегами AUtoIta .
Для этого надо выделить нужный фрагмент кода и нажать на 3-ю кнопку слева(AutoIt tag)
 
Автор
M

marmisha

Новичок
Сообщения
41
Репутация
2
Ребят, что-то я конкретно туплю (кричащий новорожденный ребенок и бессонная ночь).
gregaz сказал(а):
Если размер текстового файла позволяет ,то проще так :
Код:
#Include<Array.au3>;******Добавлено
#Include<File.au3>;*****Добавлено
$sText=FileRead(@scriptDir & "\Test.txt")
$Login="0x04";              1-Логин для поиска
;$Login="Wrong Password"  ; 2-Логин для поиска

$sPattern="(.+?\r\n)Login Fail:\s+?\Q(" & $Login & ")\E.+?"
$aRez=StringRegExp($sText,$sPattern,3)
_ArrayDisplay($aRez,'$aRez')
$hFile = FileOpen(@scriptDir & "\Test1.txt", 1) ; 1 = append
_FileWriteFromArray($hFile, $aRez)
FileClose($hFile)
Если я правильно понимаю, то в строке
Код:
;$Login="Wrong Password"  ; 2-Логин для поиска

в самом начале точка с запятой не нужна, правильно? И зачем два логина для поиска, когда это одна строка
Код:
Login Fail:  (0x04)

И как скрипт читает первоначальный текстовый файл, из которого все и выбираем? Надо же путь к файлу указывать?
Далее:

gregaz сказал(а):
marmisha [?]
Почему не работает? Что не так?

Поставь после :
Код:
$aFullText ..........
Код:
_ArrayDisplay($aFullText)

Чтобы увидеть а получил ли массив ?
Затем поставь после
Код:
Next
Код:
MsgBox(0,'$sFullText',$sFullText)

Увидишь а есть строки для записи
и т.д.
Попробывал поставить
Код:
_ArrayDisplay($aFullText)

Упорно вылетает ошибка((. Это
Код:
MsgBox(0,'$sFullText',$sFullText)

выдает пустое сообщение.
Помогите пожалуйста, уже пальцы отваливаются все сортировать самому.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
marmisha [?]
И зачем два логина для поиска, когда это одна строка[/url]

Код:
  ;
- в коде применяется для комментариев ,которые не обрабатываются скриптом при работе

Здесь в коде можно легко изменять нужный тебе Login
При установленной
Код:
  ;
будет выполняться поиск Logina : 0x04.
Достаточно просто стереть
Код:
  ;
и тогда будет искаться Login : Wrong Password





Добавлено:
Сообщение автоматически объединено:

marmisha [?]
И как скрипт читает первоначальный текстовый файл, из которого все и выбираем? Надо же путь к файлу указывать?

Код:
@scriptDir & "\Test.txt"

Это файл : Test1.txt ,находящийся в папке нахождения скрипта (путь- @scriptDir)
 
Автор
M

marmisha

Новичок
Сообщения
41
Репутация
2
Т.е. в Test1.txt и должен находится весь список, по которому и производим поиск?


Добавлено:
Сообщение автоматически объединено:

marmisha сказал(а):
Т.е. в Test1.txt и должен находится весь список, по которому и производим поиск?
Ура, работает, спасибо огромное)))Только еще вот такой вопрос, почему в созданном Test1.txt файле с результатами поиска, каждая строчка через одну пустую строчку записывается?Нельзя ли строчку за строчкой прописывать?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
marmisha [?]
Т.е. в Test1.txt и должен находится весь список, по которому и производим поиск?

Извини там у меня опечатка (я исправил)

Test1.txt - это файл в который будет вестись запись результата.
А а поиск ведется в файле :
Код:
@scriptDir & "\Test.txt"
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
marmisha [?]
Ура, работает, спасибо огромное)))Только еще вот такой вопрос, почему в созданном Test1.txt файле с результатами поиска, каждая строчка через одну пустую строчку записывается?Нельзя ли строчку за строчкой прописывать?

Это результат работы функции :
Код:
_FileWriteFromArray($hFile, $aRez)

Можно Провести запись по другому





Добавлено:
Сообщение автоматически объединено:

Вот так :
Код:
$hFile = FileOpen(@scriptDir & "\Test1.txt", 1) ; 1 = append
For $i=0 To UBound($aRez)-1
   FileWriteLine ($hFile, $aRez[$i] )
Next
  FileClose($hFile)
 
Автор
M

marmisha

Новичок
Сообщения
41
Репутация
2
Все отлично работает и так, как нужно. Огромное человеческое СПАСИБО!!! С меня :beer:
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
marmisha [?]
Только еще вот такой вопрос, почему в созданном Test1.txt файле с результатами поиска, каждая строчка через одну пустую строчку записывается?Нельзя ли строчку за строчкой прописывать?

Если Изменить строчку :
Код:
$sPattern="(.+?\r\n)Login Fail:\s+?\Q(" & $Login & ")\E.+?"

на :
Код:
$sPattern="(.+?)\r\nLogin Fail:\s+?\Q(" & $Login & ")\E.+?"


то нормально пишет и :
Код:
_FileWriteFromArray($hFile, $aRez)
 
Верх