Что нового

[Данные, строки] Поиск определенных данных в txt и копирование их в другой txt

prokazzza

Новичок
Сообщения
160
Репутация
2
Столкнулся с проблемой поиска и копирования данных в обычном тхт. Имеется текстовик на 830 строк, в нем есть нужные строки-данные. Задача вроде простенькая, найти эти строки и скопировать их в отдельный текстовик. Искал в инете, кроме вот такого скрипта, ничего не нашел:

Код:
#include <Array.au3>

$sTemp = ''
$sTest = 'вася'
$i = 0
$j = 0
Dim $aTest[1]
$hFile = FileOpen('test.txt', 0)
While 1
    $i += 1
    $sTemp = FileReadLine($hFile, $i)
    If @error = -1 Then ExitLoop
    If StringInStr($sTemp, $sTest) Then
        $j += 1
        ReDim $aTest[$j + 1]
        $aTest[$j] = $i
    EndIf
WEnd
FileClose($hFile)
If Not $j Then
    MsgBox(0, '', 'Нет совпадений.')
Else
    $aTest[0] = 'Найдено совпадений: ' & $j & ' в строках:'
    _ArrayDisplay($aTest, 'Прочитано строк: ' & $i - 1)
EndIf


Ищет строки норм, (за исключением одной мелочи), но не могу разобраться как сделать, чтобы он не выводил данные в окно, а копировал найденные строки в другой текстовик. Может кто подскажет, как возможно это реализовать.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
prokazzza [?]
как возможно это реализовать
Код:
$source = FileOpen("source.txt") ; файл-источник
$dest = FileOpen("dest.txt", 2) ; файл-получатель
$template = "искомая строка"

While 1
  $str = FileReadLine($source)
  If @error = -1 Then ExitLoop
  If StringInStr($str, $template) Then
    FileWriteLine($dest, $str)
  EndIf
WEnd

FileClose($source)
FileClose($dest)
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
InnI Спасибо, но как я говорил есть загвозка, в файле присутствуют 2 такие строки, одна идет:

<текст

а вторая просто:

текст

Собственно, как можно копировать данные, только с второго варианта ??
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
If StringCompare($str, $template) = 0 Then
; или просто
If $str = $template Then
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
Пример начала строк, начало у всех оно одинаковое, но сильно различается концовкой.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
prokazzza [?]
Пример начала строк, начало у всех оно одинаковое, но сильно различается концовкой.
И это называется "мелочь" и "загвоздка" ?! ;D
Выкладывайте строки и ждите специалистов по регулярным выражениям.
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
Строки выглядят примерно так:

Код:
<Текст/87490903309/85г788499898=мти8588948489
Текст/87490903309/85г788499898=мти8588948489

Далее идет куча ненужной информации и опять:

<Текст/85899848980/м56м56м5555=мт88т88тн7и7и
Текст/85899848980/м56м56м5555=мт88т88тн7и7и

и т.д.


Только начало у всех одинаковое. Не думал что столько загвоздки может возникнуть из-за простого символа < . :(
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Пробуйте
Код:
$source = FileOpen("source.txt") ; файл-источник
$dest = FileOpen("dest.txt", 2) ; файл-получатель
$template = "Текст"

While 1
  $str = FileReadLine($source)
  If @error = -1 Then ExitLoop
  If StringInStr($str, $template) = 1 Then
    FileWriteLine($dest, $str)
  EndIf
WEnd

FileClose($source)
FileClose($dest)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
В следующий раз старайтесь сразу подробно объяснять про "мелочи" и "загвоздки".
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
InnI А такую фишку, как добавление в название файла, количества найденных строк, на примере скрипта из шапки. К примеру обработался файл, скопировалось 26 строк. В конечный файл, к примеру test_2 добавляется вот такое:

test_2 (26).txt
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
#include <File.au3>
$lines = _FileCountLines("dest.txt")
FileMove("dest.txt", "dest (" & $lines & ").txt")
 
Автор
P

prokazzza

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

Код:
If Not FileExists(@ScriptDir &'\temp') Then DirCreate(@ScriptDir &'\temp')	
Sleep(50)

$FilesTotal = 'test.txt'

$source = FileOpen($FilesTotal) ; файл-источник
$dest = FileOpen(@ScriptDir &'\temp\' & $FilesTotal, 2) ; файл-получатель
$template = "Текст"

While 1
  $str = FileReadLine($source)
  If @error = -1 Then ExitLoop
  If StringInStr($str, $template) = 1 Then
    FileWriteLine($dest, $str)
  EndIf
WEnd

FileClose($source)
FileClose($dest)

$lines = _FileCountLines(@ScriptDir &'\temp\' & $FilesTotal)
FileMove(@ScriptDir &'\temp\' & $FilesTotal, @ScriptDir &'\temp\'& '(' & $lines & ") " & $FilesTotal)


Обработанный файл имеет такое-же имя и кладется в папку temp.

Можно ли автоматизировать процесс, если в папке не один такой файл, а с десяток в примеру. В эту папку каждый день падает от 2 до 5 таких файлов, хотелось бы попробывать автоматизиваровать процесс. Закинуть туда скрипт и пусть обрабатывает при поступлении нового файла. Загвоздка заключается в том, что файлы имеют опять разные названия и чтобы не запутаться, файл на выходе должен иметь такое же.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
prokazzza [?]
а чуть посложнее задачку можно задать?

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
madmasles Т.е если в скрипте будет 20 функций, 20 тем создавать? Просто на будущее.



Ну да ладно.


InnI спасибо что помогли.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
prokazzza [?]
Т.е если в скрипте будет 20 функций, 20 тем создавать?
Если это разные темы, тогда да (при условии что решения проблеме на форуме не нашёл).
Или может нам специально отвести тему под названием prokazzza, и ты будешь в ней получать ответы на все свои вопросы? :smile:

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

Достаточно исчерпывающая информация по этому поводу?
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
InnI вопрос по теме, можете показать на примере прошлой задачи, но:

Код:
<Текст/87490903309/85г788499898=мти8588948489
Текст/87490903309/85г788499898=мти8588948489
Текст/21381748979/т89сим89ми8=тм8м9т898904

Далее идет куча ненужной информации и опять:

<Текст/85899848980/м56м56м5555=мт88т88тн7и7и
Текст/85899848980/м56м56м5555=мт88т88тн7и7и
Текст/48234824434/мт8имм8т9м8=тсии7859ь0909

и т.д.

Если данные нужно вытащить с 2 и более строк, по порядку, чтобы в итоге вглядело так:

Код:
Текст/87490903309/85г788499898=мти8588948489
Текст/21381748979/т89сим89ми8=тм8м9т898904
Текст/85899848980/м56м56м5555=мт88т88тн7и7и
Текст/48234824434/мт8имм8т9м8=тсии7859ь0909
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
prokazzza, а в чём проблема? У меня именно так и работает: из предоставленного вами текста остаются эти четыре строки.
 
Верх