Автор Тема: [Данные, строки] Поиск определенных данных в txt и копирование их в другой txt  (Прочитано 4881 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн prokazzza [?]

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

Код: AutoIt [Выделить]
#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


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

Русское сообщество AutoIt


Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3215
  • Репутация: 844
    • Награды
  • Версия AutoIt: 3.3.14.0
prokazzza  [?]
Цитировать
как возможно это реализовать
Код: AutoIt [Выделить]
$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)


Оффлайн prokazzza [?]

  • Новичок
  • *
  • Сообщений: 159

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

<текст

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

текст

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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3215
  • Репутация: 844
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
If StringCompare($str, $template) = 0 Then
; или просто
If $str = $template Then


Русское сообщество AutoIt


Оффлайн prokazzza [?]

  • Новичок
  • *
  • Сообщений: 159

  • Автор темы
  • Репутация: 2
    • Награды
Не получилось, текстовик пуст  :(

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3215
  • Репутация: 844
    • Награды
  • Версия AutoIt: 3.3.14.0
prokazzza  [?]
Цитировать
присутствуют 2 такие строки, одна идет:
<текст
а вторая просто:
текст
Это целиком строки или только части строк?

Оффлайн prokazzza [?]

  • Новичок
  • *
  • Сообщений: 159

  • Автор темы
  • Репутация: 2
    • Награды
Пример начала строк, начало у всех оно одинаковое, но сильно различается концовкой.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3215
  • Репутация: 844
    • Награды
  • Версия AutoIt: 3.3.14.0
prokazzza  [?]
Цитировать
Пример начала строк, начало у всех оно одинаковое, но сильно различается концовкой.
И это называется "мелочь" и "загвоздка" ?!  ;D
Выкладывайте строки и ждите специалистов по регулярным выражениям.

Русское сообщество AutoIt


Оффлайн prokazzza [?]

  • Новичок
  • *
  • Сообщений: 159

  • Автор темы
  • Репутация: 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 Гуру
  • *****
  • Сообщений: 3215
  • Репутация: 844
    • Награды
  • Версия AutoIt: 3.3.14.0
Пробуйте
Код: AutoIt [Выделить]
$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)


Оффлайн prokazzza [?]

  • Новичок
  • *
  • Сообщений: 159

  • Автор темы
  • Репутация: 2
    • Награды

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3215
  • Репутация: 844
    • Награды
  • Версия AutoIt: 3.3.14.0
В следующий раз старайтесь сразу подробно объяснять про "мелочи" и "загвоздки".

Оффлайн prokazzza [?]

  • Новичок
  • *
  • Сообщений: 159

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

test_2 (26).txt

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3215
  • Репутация: 844
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <File.au3>
$lines = _FileCountLines("dest.txt")
FileMove("dest.txt", "dest (" & $lines & ").txt")


Оффлайн prokazzza [?]

  • Новичок
  • *
  • Сообщений: 159

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

Код: AutoIt [Выделить]
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 таких файлов, хотелось бы попробывать автоматизиваровать процесс. Закинуть туда скрипт и пусть обрабатывает при поступлении нового файла. Загвоздка заключается в том, что файлы имеют опять разные названия и чтобы не запутаться, файл на выходе должен иметь такое же.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
2576 Просмотров
Последний ответ Май 16, 2011, 11:26:01
от sentiq22
3 Ответов
3709 Просмотров
Последний ответ Июль 26, 2011, 21:23:13
от madmasles
2 Ответов
3740 Просмотров
Последний ответ Апрель 15, 2012, 13:37:51
от Redline
5 Ответов
3318 Просмотров
Последний ответ Июль 23, 2013, 03:57:13
от AZJIO
6 Ответов
1229 Просмотров
Последний ответ Январь 14, 2015, 16:53:07
от СН3СН2ОН
2 Ответов
954 Просмотров
Последний ответ Март 03, 2015, 16:48:17
от AZJIO
3 Ответов
2457 Просмотров
Последний ответ Август 12, 2015, 14:27:03
от w13
4 Ответов
867 Просмотров
Последний ответ Октябрь 17, 2015, 03:27:25
от sysscrew
11 Ответов
643 Просмотров
Последний ответ Сентябрь 02, 2016, 16:49:43
от ra4o
0 Ответов
378 Просмотров
Последний ответ Январь 22, 2017, 02:59:03
от ason