Замена кусков текста в выделенных файлах
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: Замена кусков текста в выделенных файлах Author: FlasherLocation: Москва PostPosted: Tue Oct 05, 2010 09:56
    —
Есть скрипты, которые меняют только строки, а вот по кускам текста с переводами строк и т.п. ничего подобного не видел. Поправьте, если я ошибаюсь, в VBS это не достижимо. Может, кто-то напишет подобный скрипт/макрос на autoIt, AHK, PA, MTW, ABT,.. или батник с использованием двух файлов, в каждом из которых кусок старого и кусок нового текста соответственно? Последний вариант менее предпочтителен, поскольку хотелось бы вставлять текст в полях появляющихся окон.
И для прогеров, и для WEB-дизайнеров будет очень полезная штука.

#2:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Tue Oct 05, 2010 10:03
    —
Нужен именно скрипт? Утилита не подойдет?
Если подойдет, то вопрос следует поставить так: "есть ли БЕСПЛАТНАЯ утилита для замены...", а то скатимся к нарушению п. 5.

#3:  Author: FlasherLocation: Москва PostPosted: Tue Oct 05, 2010 10:05
    —
Вахмурка
Она бы подошла, если бы работала с выделенными в панели ТС файлами(без D&D). Не думаю, что у тебя такая есть. Wink

#4:  Author: CaptainFlintLocation: Москва PostPosted: Tue Oct 05, 2010 10:14
    —
%L + lst2multi, не?

#5:  Author: FlasherLocation: Москва PostPosted: Tue Oct 05, 2010 10:25
    —
Не факт, что предлагаемая утилита - MDI. Так, до кучи ещё - F4Menu, но всё это ".. из пустого в порожнее"..

#6:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Oct 05, 2010 10:38
    —
Flasher wrote:
Есть скрипты, которые меняют только строки, а вот по кускам текста с переводами строк и т.п. ничего подобного не видел. Поправьте, если я ошибаюсь, в VBS это не достижимо.

Поправляю - ошибаешься.
Как бы ты хотел видеть работу скрипта?

#7:  Author: FlasherLocation: Москва PostPosted: Tue Oct 05, 2010 10:42
    —
Batya wrote:
Поправляю - ошибаешься.
Это радует. Smile
В идеале - разделённое на два поля по горизонтали/вертикали окно. В первом поле производится ввод старого текста, во втором - нового. Кнопка ОК для подтверждения замены. Не в идеале - как в случае с двухоконным скриптом Volniy.
Ещё добавлю: все файлы(или файлы по маске) в выделенных папках должны быть также подвержены текстовой замене.

#8:  Author: Loopback PostPosted: Tue Oct 05, 2010 11:21
    —
Flasher
Набросал такой быстрый вариант, с двумя полями ввода, но пока без рекурсии. Просто с ней не очень ясная логика получается: с одной стороны, выделяем файлы в тотале, т.е. создаем явный список файлов. С другой стороны - если рекурсивно обрабатывать выделенные подкаталоги, то список уже получается неявный. А если задавать маску - то должна ли она применяться к явно выделенным файлам?

Кроме того, скриптом не рекомендуется обрабатывать большие файлы, поскольку сейчас текст целиком грузится в память. Для больших придется придумывать что-то другое.

Code:

; Параметр: %L

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

If $CmdLine[0] < 1 Then
    MsgBox (0, "", "Недостаточно параметров, должен быть 1.")
    Exit
EndIf

Global $aList  = _TCHLoadFileList($CmdLine[1])
Global $gReplaces = 0

$hGUI = GUICreate("Поиск и замена", 563, 232, -1, -1)
$edSrc = GUICtrlCreateEdit("", 8, 48, 265, 145)
$edTrg = GUICtrlCreateEdit("", 288, 48, 265, 145)
$btnOK = GUICtrlCreateButton("OK", 400, 200, 75, 25)
$btnCancel = GUICtrlCreateButton("Отмена", 480, 200, 75, 25)
$lblinfo = GUICtrlCreateLabel("", 8, 6, 295, 17)
GUICtrlCreateLabel("Текст для поиска", 8, 30, 94, 17)
GUICtrlCreateLabel("Текст для замены", 288, 30, 98, 17)
$cbCaseSence = GUICtrlCreateCheckbox("Учитывать регистр", 8, 208, 137, 17)
GUISetState(@SW_SHOW)

GUICtrlSetData($lblinfo, "Выделено для замены " & $aList[0] & " файлов.")
If $aList[0] = 0 Then GUICtrlSetState($btnOK, $GUI_DISABLE)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE, $btnCancel
         Exit
        Case $btnOK
            For $i = 1 To $aList[0]
                $sSrcText = FileRead($aList[$i])
                $sTrgText = StringReplace($sSrcText, GUICtrlRead($edSrc), GUICtrlRead($edTrg), 0, BitAND(GUICtrlRead($cbCaseSence), $GUI_CHECKED))
                If @extended Then
                    $gReplaces += @extended
                    $hFile = FileOpen($aList[$i], 2)
                    FileWrite($hFile, $sTrgText)
                    FileClose($hFile)
                EndIf
            Next
            MsgBox (0, "", "Выполнено " & $gReplaces & " замен.", 0, $hGUI)
            Exit
   EndSwitch
WEnd

Func _TCHLoadFileList($sFileName)
    Local $asList[1] = [0]
    Local $hfList = FileOpen($sFileName, 0)
    While 1
        $sLine = FileReadLine($hfList)
        If @error Then Exitloop
        ReDim $asList[UBound($asList)+1]
        $asList[UBound($asList)-1] = $sLine
    Wend
    FileClose($hfList)
    $asList[0] = UBound($asList)-1
    Return $asList
EndFunc

#9:  Author: FlasherLocation: Москва PostPosted: Tue Oct 05, 2010 11:28
    —
Loopback wrote:
А если задавать маску - то должна ли она применяться к явно выделенным файлам?
Маска, если задана, то, естественно, должна применяться ко всему списку без исключения.
Loopback wrote:
Кроме того, скриптом не рекомендуется обрабатывать большие файлы, поскольку сейчас текст целиком грузится в память. Для больших придется придумывать что-то другое.
На сколько это страшно по времени? Память какая подразумевается, виртуальная или оперативная?

Скрипт отлично работает с выделенными файлами! Спасибо! Доработка не помешает. Smile

Ждём ещё Batya. Интересно, что он на этот раз придумал. Wink

#10:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Oct 05, 2010 12:13
    —
Flasher wrote:
В идеале - разделённое на два поля по горизонтали/вертикали окно. В первом поле производится ввод старого текста, во втором - нового. Кнопка ОК для подтверждения замены. Не в идеале - как в случае с двухоконным скриптом Volniy.

Идеальный вариант в vbs релизовать не очень просто - нет соответствующего встроенного механизма для формирования пользовательского интерфейса. Можно нарисовать hta, но на это нужно время, которого сейчас, к сожалению, нет Sad
Могу предложить вводить по очереди в двух окнах. Но при этом текст можно будет вводить только в одну строку, заменяя переносы строк, например, на \n.

#11:  Author: FlasherLocation: Москва PostPosted: Tue Oct 05, 2010 12:19
    —
Loopback
Что-то библиотек многовато, скомпилинный файл получился 308 Кб. Sad

Batya wrote:
Могу предложить вводить по очереди в двух окнах. Но при этом текст можно будет вводить только в одну строку, заменяя переносы строк, например, на \n.
Ну я так и предполагал, что вроде этого будет. Устроит, если переносы будут в кэше автоматически меняться на \n.

Last edited by Flasher on Tue Oct 05, 2010 12:24; edited 1 time in total

#12:  Author: CaptainFlintLocation: Москва PostPosted: Tue Oct 05, 2010 12:21
    —
Flasher wrote:
Не факт, что предлагаемая утилита - MDI.

Если бы была MDI, то извращаться нечего, %S и все дела. Я как раз и подразумевал, что программа может обрабатывать лишь по одному файлу за раз, тогда lst2multi и приведёт к многократному вызову утилиты для каждого файла в отдельности.

#13:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Oct 05, 2010 12:42
    —
Flasher wrote:
Устроит, если переносы будут в кэше автоматически меняться на \n.

Не понял, в каком "кэше"?

#14:  Author: Loopback PostPosted: Tue Oct 05, 2010 12:49
    —
Flasher wrote:
Что-то библиотек многовато, скомпилинный файл получился 308 Кб.

Библиотек по минимуму. Размер самого сжатого скрипта около 14 кб, все остальное - интерпретатор. Тут уж ничего не поделаешь. Я поэтому все скрипты держу в исходниках, тогда достаточно одного экзешника.

Flasher wrote:
На сколько это страшно по времени? Память какая подразумевается, виртуальная или оперативная?

Предполагаю, что виртуальная. Но просто файл размером в гигабайт будет грузиться ну очень долго. Да и неэффективно это будет. Впрочем, загрузка файлов в пару-тройку десятков мегабайт будет незаметна и сейчас.

По остальному - ок, добавлю рекурсию.

#15:  Author: FlasherLocation: Москва PostPosted: Tue Oct 05, 2010 12:50
    —
Batya
Речь о формировании временных файлов с текстом поиска/замены (в папке %TEMP%, по всей видимости). Или если какой-то более изощрённый способ?

Loopback wrote:
Тут уж ничего не поделаешь. Я поэтому все скрипты держу в исходниках, тогда достаточно одного экзешника.
Так в том-то и дело, что не достаточно, нужно аж пять дополнительных библиотек.
Loopback wrote:
Но просто файл размером в гигабайт будет грузиться ну очень долго.
У меня таких огромных нет и в ближайшие годы не предвидится. Smile



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9  Next  :| |:
Page 1 of 9

Powered by phpBB © 2001, 2005 phpBB Group