Что нового

Извлечение из txt по списку - в разные текстовые файлы

Пост номер 4 был отмечен как лучший ответ.

Snegovik

Чайник
Сообщения
41
Репутация
0
Здравствуйте.
Помогите изменить скрипт.

Имеется код autoit, который извлекает определенные слова из текстового файла 1.txt и складирует этот извлеченный текст - в файл Текст.txt.
Проблема в том, что поскольку подобных "поисковых слов" много - то приходится под каждое слово использовать свой отдельный скрипт.
А потом объединять эти скрипты - в одном общем скрипте:
Код:
#include <Текст.au3>
#include <Отметка.au3>

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

Как сделать так, чтобы слово, по которому производится поиск - бралось из файла "список.txt" ?
То есть, чтобы эта операция выполнялась сперва для одного слова из списка, потом автоматически - для другого слова из списка.
Тогда не нужно будет создавать скрипт для каждого отдельного поискового слова, и учитывать его в общем скрипте - а достаточно будет просто вписать в список.txt - новое слово.

Сейчас в строке, может учитываться только одно слово:
Код:
"(*UCP)(?im)(\d+\w+\d{4}).*?текст(\(.+?\),)"

А если слов, таких как "текст" - будет несколько - их же так не записать.

Код:
#;~ AutoIt Version: 3.3.14.5
#include <FileConstants.au3>
#include <StringConstants.au3>

;Local $sFile = FileOpenDialog("", @ScriptDir, "Все (*.*)", $FD_FILEMUSTEXIST)
Local $sFile = @ScriptDir & '\1.txt'
Local $sFile2 = @ScriptDir & '\Текст.txt'
If @error Then Exit

Local $aRegExp = StringRegExp(FileRead($sFile), "(*UCP)(?im)(\d+\w+\d{4}).*?текст(\(.+?\),)", $STR_REGEXPARRAYGLOBALFULLMATCH), $aTemp, $sOut
For $i = 0 To UBound($aRegExp) - 1
    $aTemp = $aRegExp[$i]
    For $j = 1 To UBound($aTemp) - 1
        $sOut &= $aTemp[$j]
    Next
    $sOut &= @CRLF
Next

;$sFile = FileSaveDialog("", "", "Все (*.*)", $FD_PROMPTOVERWRITE, $sFile)
;$sFile = @ScriptDir/2.txt
If @error Then Exit

Local $hFile = FileOpen($sFile2, $FO_OVERWRITE + $FO_UTF8 + $FO_CREATEPATH)
FileWrite($hFile, StringTrimRight($sOut, 2))
FileClose($hFile)
;ShellExecute($sFile2)
 

Вложения

Tempo

Скриптер
Сообщения
495
Репутация
145
Код:
;~ AutoIt Version: 3.3.14.5
#include <FileConstants.au3>
#include <StringConstants.au3>

;~ Local $sFile = FileOpenDialog("", @ScriptDir, "Все (*.*)", $FD_FILEMUSTEXIST)
;~ If @error Then Exit
Local $sFileIn = @ScriptDir & '\1.txt'
Local $sFileOut = @ScriptDir & '\Отметка.txt'

Local $sWords = "(?:" & StringRegExpReplace(StringStripWS(FileRead("Список.txt"), $STR_STRIPLEADING + $STR_STRIPTRAILING), "\R", "|") & ")"
Local $aRegExp = StringRegExp(FileRead($sFileIn), "(*UCP)(?im)^(\d+\w+\d{4})(.*" & $sWords & ".*)", $STR_REGEXPARRAYGLOBALMATCH), $aTemp, $sOut
For $i = 0 To UBound($aRegExp) - 1 Step 2
    $aTemp = StringRegExp($aRegExp[$i + 1], $sWords & "(\(.+?\),)", $STR_REGEXPARRAYGLOBALMATCH)
    For $j = 0 To UBound($aTemp) - 1
        $sOut &= $aRegExp[$i] & $aTemp[$j] & @CRLF
    Next
Next

;~ $sFile = FileSaveDialog("", "", "Все (*.*)", $FD_PROMPTOVERWRITE, $sFile)
;~ $sFile = @ScriptDir/2.txt
;~ If @error Then Exit

Local $hFile = FileOpen($sFileOut, $FO_OVERWRITE + $FO_UTF8 + $FO_CREATEPATH)
FileWrite($hFile, StringTrimRight($sOut, 2))
FileClose($hFile)
;~ ShellExecute($sFileOut)
 
Автор
S

Snegovik

Чайник
Сообщения
41
Репутация
0
Tempo, Спасибо за ответ.
Скрипт сейчас немного неправильно работает.

В файле список.txt - два слова : текст и отметка.
Скрипт сбрасывает найденный текст - не в два отдельных файла, а как бы - в одну кучу - в общий файл "отметка.txt".
 

Tempo

Скриптер
Сообщения
495
Репутация
145
Скрипт сейчас немного неправильно работает.
Скрипт сбрасывает найденный текст - не в два отдельных файла
Где об этом указано в ТЗ?
Код:
;~ AutoIt Version: 3.3.14.5
#include <FileConstants.au3>
#include <StringConstants.au3>

;~ Local $sFileIn = FileOpenDialog("", @ScriptDir, "Все (*.*)", $FD_FILEMUSTEXIST)
;~ If @error Then Exit
Local $sFileIn = @ScriptDir & '\1.txt'

Local $sWords = StringRegExpReplace(StringStripWS(FileRead("Список.txt"), $STR_STRIPLEADING + $STR_STRIPTRAILING), "\R", "|")
Local $oDict = ObjCreate("Scripting.Dictionary")

Local $aRegExp = StringRegExp(FileRead($sFileIn), "(*UCP)(?im)^(\d+\w+\d{4})(.*(?:" & $sWords & ").*)", $STR_REGEXPARRAYGLOBALMATCH), $aTemp
For $i = 0 To UBound($aRegExp) - 1 Step 2
    $aTemp = StringRegExp($aRegExp[$i + 1], "(" & $sWords & ")(\(.+?\),)", $STR_REGEXPARRAYGLOBALMATCH)
    For $j = 0 To UBound($aTemp) - 1 Step 2
        $oDict.Item($aTemp[$j]) &= $aRegExp[$i] & $aTemp[$j + 1] & @CRLF
    Next
Next

Local $hFile
For $sKey In $oDict.Keys
    $hFile = FileOpen(@ScriptDir & "\" & $sKey & ".txt", $FO_OVERWRITE + $FO_UTF8)
    FileWrite($hFile, StringTrimRight($oDict.Item($sKey), 2))
    FileClose($hFile)
Next
 
Последнее редактирование:
Автор
S

Snegovik

Чайник
Сообщения
41
Репутация
0
Спасибо.
Сейчас текст извлекается по разным файлам.

Но там - дата отсутствует.
 
Автор
S

Snegovik

Чайник
Сообщения
41
Репутация
0
Tempo, большое Вам человеческое спасибо.
Вы меня очень выручили.
 
Верх