Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Замена кусков текста в выделенных файлах
Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Flasher



Joined: 06 Nov 2009
Posts: 13839
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 09:56    Post subject: Замена кусков текста в выделенных файлах Reply with quote

Есть скрипты, которые меняют только строки, а вот по кускам текста с переводами строк и т.п. ничего подобного не видел. Поправьте, если я ошибаюсь, в VBS это не достижимо. Может, кто-то напишет подобный скрипт/макрос на autoIt, AHK, PA, MTW, ABT,.. или батник с использованием двух файлов, в каждом из которых кусок старого и кусок нового текста соответственно? Последний вариант менее предпочтителен, поскольку хотелось бы вставлять текст в полях появляющихся окон.
И для прогеров, и для WEB-дизайнеров будет очень полезная штука.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2535
Location: Большая деревня Москва

Post (Separately) Posted: Tue Oct 05, 2010 10:03    Post subject: Reply with quote

Нужен именно скрипт? Утилита не подойдет?
Если подойдет, то вопрос следует поставить так: "есть ли БЕСПЛАТНАЯ утилита для замены...", а то скатимся к нарушению п. 5.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13839
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 10:05    Post subject: Reply with quote

Вахмурка
Она бы подошла, если бы работала с выделенными в панели ТС файлами(без D&D). Не думаю, что у тебя такая есть. Wink
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 5953
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 10:14    Post subject: Reply with quote

%L + lst2multi, не?
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13839
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 10:25    Post subject: Reply with quote

Не факт, что предлагаемая утилита - MDI. Так, до кучи ещё - F4Menu, но всё это ".. из пустого в порожнее"..
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Tue Oct 05, 2010 10:38    Post subject: Reply with quote

Flasher wrote:
Есть скрипты, которые меняют только строки, а вот по кускам текста с переводами строк и т.п. ничего подобного не видел. Поправьте, если я ошибаюсь, в VBS это не достижимо.

Поправляю - ошибаешься.
Как бы ты хотел видеть работу скрипта?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13839
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 10:42    Post subject: Reply with quote

Batya wrote:
Поправляю - ошибаешься.
Это радует. Smile
В идеале - разделённое на два поля по горизонтали/вертикали окно. В первом поле производится ввод старого текста, во втором - нового. Кнопка ОК для подтверждения замены. Не в идеале - как в случае с двухоконным скриптом Volniy.
Ещё добавлю: все файлы(или файлы по маске) в выделенных папках должны быть также подвержены текстовой замене.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 984

Post (Separately) Posted: Tue Oct 05, 2010 11:21    Post subject: Reply with quote

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
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13839
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 11:28    Post subject: Reply with quote

Loopback wrote:
А если задавать маску - то должна ли она применяться к явно выделенным файлам?
Маска, если задана, то, естественно, должна применяться ко всему списку без исключения.
Loopback wrote:
Кроме того, скриптом не рекомендуется обрабатывать большие файлы, поскольку сейчас текст целиком грузится в память. Для больших придется придумывать что-то другое.
На сколько это страшно по времени? Память какая подразумевается, виртуальная или оперативная?

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

Ждём ещё Batya. Интересно, что он на этот раз придумал. Wink
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Tue Oct 05, 2010 12:13    Post subject: Reply with quote

Flasher wrote:
В идеале - разделённое на два поля по горизонтали/вертикали окно. В первом поле производится ввод старого текста, во втором - нового. Кнопка ОК для подтверждения замены. Не в идеале - как в случае с двухоконным скриптом Volniy.

Идеальный вариант в vbs релизовать не очень просто - нет соответствующего встроенного механизма для формирования пользовательского интерфейса. Можно нарисовать hta, но на это нужно время, которого сейчас, к сожалению, нет Sad
Могу предложить вводить по очереди в двух окнах. Но при этом текст можно будет вводить только в одну строку, заменяя переносы строк, например, на \n.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13839
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 12:19    Post subject: Reply with quote

Loopback
Что-то библиотек многовато, скомпилинный файл получился 308 Кб. Sad

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

Last edited by Flasher on Tue Oct 05, 2010 12:24; edited 1 time in total
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 5953
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 12:21    Post subject: Reply with quote

Flasher wrote:
Не факт, что предлагаемая утилита - MDI.

Если бы была MDI, то извращаться нечего, %S и все дела. Я как раз и подразумевал, что программа может обрабатывать лишь по одному файлу за раз, тогда lst2multi и приведёт к многократному вызову утилиты для каждого файла в отдельности.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Tue Oct 05, 2010 12:42    Post subject: Reply with quote

Flasher wrote:
Устроит, если переносы будут в кэше автоматически меняться на \n.

Не понял, в каком "кэше"?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 984

Post (Separately) Posted: Tue Oct 05, 2010 12:49    Post subject: Reply with quote

Flasher wrote:
Что-то библиотек многовато, скомпилинный файл получился 308 Кб.

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

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

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

По остальному - ок, добавлю рекурсию.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13839
Location: Москва

Post (Separately) Posted: Tue Oct 05, 2010 12:50    Post subject: Reply with quote

Batya
Речь о формировании временных файлов с текстом поиска/замены (в папке %TEMP%, по всей видимости). Или если какой-то более изощрённый способ?

Loopback wrote:
Тут уж ничего не поделаешь. Я поэтому все скрипты держу в исходниках, тогда достаточно одного экзешника.
Так в том-то и дело, что не достаточно, нужно аж пять дополнительных библиотек.
Loopback wrote:
Но просто файл размером в гигабайт будет грузиться ну очень долго.
У меня таких огромных нет и в ближайшие годы не предвидится. Smile
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9  Next
Page 1 of 9

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group