View previous topic :: View next topic |
Author |
Message |
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 09:56 Post subject: Замена кусков текста в выделенных файлах |
|
|
Есть скрипты, которые меняют только строки, а вот по кускам текста с переводами строк и т.п. ничего подобного не видел. Поправьте, если я ошибаюсь, в VBS это не достижимо. Может, кто-то напишет подобный скрипт/макрос на autoIt, AHK, PA, MTW, ABT,.. или батник с использованием двух файлов, в каждом из которых кусок старого и кусок нового текста соответственно? Последний вариант менее предпочтителен, поскольку хотелось бы вставлять текст в полях появляющихся окон.
И для прогеров, и для WEB-дизайнеров будет очень полезная штука. |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Tue Oct 05, 2010 10:03 Post subject: |
|
|
Нужен именно скрипт? Утилита не подойдет?
Если подойдет, то вопрос следует поставить так: "есть ли БЕСПЛАТНАЯ утилита для замены...", а то скатимся к нарушению п. 5. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 10:05 Post subject: |
|
|
Вахмурка
Она бы подошла, если бы работала с выделенными в панели ТС файлами(без D&D). Не думаю, что у тебя такая есть. |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 10:14 Post subject: |
|
|
%L + lst2multi, не? _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 10:25 Post subject: |
|
|
Не факт, что предлагаемая утилита - MDI. Так, до кучи ещё - F4Menu, но всё это ".. из пустого в порожнее".. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Oct 05, 2010 10:38 Post subject: |
|
|
Flasher wrote: | Есть скрипты, которые меняют только строки, а вот по кускам текста с переводами строк и т.п. ничего подобного не видел. Поправьте, если я ошибаюсь, в VBS это не достижимо. |
Поправляю - ошибаешься.
Как бы ты хотел видеть работу скрипта? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 10:42 Post subject: |
|
|
Batya wrote: | Поправляю - ошибаешься. | Это радует.
В идеале - разделённое на два поля по горизонтали/вертикали окно. В первом поле производится ввод старого текста, во втором - нового. Кнопка ОК для подтверждения замены. Не в идеале - как в случае с двухоконным скриптом Volniy.
Ещё добавлю: все файлы(или файлы по маске) в выделенных папках должны быть также подвержены текстовой замене. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1290
|
(Separately) Posted: Tue Oct 05, 2010 11:21 Post subject: |
|
|
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 |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 11:28 Post subject: |
|
|
Loopback wrote: | А если задавать маску - то должна ли она применяться к явно выделенным файлам? | Маска, если задана, то, естественно, должна применяться ко всему списку без исключения.
Loopback wrote: | Кроме того, скриптом не рекомендуется обрабатывать большие файлы, поскольку сейчас текст целиком грузится в память. Для больших придется придумывать что-то другое. | На сколько это страшно по времени? Память какая подразумевается, виртуальная или оперативная?
Скрипт отлично работает с выделенными файлами! Спасибо! Доработка не помешает.
Ждём ещё Batya. Интересно, что он на этот раз придумал. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Oct 05, 2010 12:13 Post subject: |
|
|
Flasher wrote: | В идеале - разделённое на два поля по горизонтали/вертикали окно. В первом поле производится ввод старого текста, во втором - нового. Кнопка ОК для подтверждения замены. Не в идеале - как в случае с двухоконным скриптом Volniy. |
Идеальный вариант в vbs релизовать не очень просто - нет соответствующего встроенного механизма для формирования пользовательского интерфейса. Можно нарисовать hta, но на это нужно время, которого сейчас, к сожалению, нет
Могу предложить вводить по очереди в двух окнах. Но при этом текст можно будет вводить только в одну строку, заменяя переносы строк, например, на \n. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 12:19 Post subject: |
|
|
Loopback
Что-то библиотек многовато, скомпилинный файл получился 308 Кб.
Batya wrote: | Могу предложить вводить по очереди в двух окнах. Но при этом текст можно будет вводить только в одну строку, заменяя переносы строк, например, на \n. | Ну я так и предполагал, что вроде этого будет. Устроит, если переносы будут в кэше автоматически меняться на \n.
Last edited by Flasher on Tue Oct 05, 2010 12:24; edited 1 time in total |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 12:21 Post subject: |
|
|
Flasher wrote: | Не факт, что предлагаемая утилита - MDI. |
Если бы была MDI, то извращаться нечего, %S и все дела. Я как раз и подразумевал, что программа может обрабатывать лишь по одному файлу за раз, тогда lst2multi и приведёт к многократному вызову утилиты для каждого файла в отдельности. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Oct 05, 2010 12:42 Post subject: |
|
|
Flasher wrote: | Устроит, если переносы будут в кэше автоматически меняться на \n. |
Не понял, в каком "кэше"? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1290
|
(Separately) Posted: Tue Oct 05, 2010 12:49 Post subject: |
|
|
Flasher wrote: | Что-то библиотек многовато, скомпилинный файл получился 308 Кб. |
Библиотек по минимуму. Размер самого сжатого скрипта около 14 кб, все остальное - интерпретатор. Тут уж ничего не поделаешь. Я поэтому все скрипты держу в исходниках, тогда достаточно одного экзешника.
Flasher wrote: | На сколько это страшно по времени? Память какая подразумевается, виртуальная или оперативная? |
Предполагаю, что виртуальная. Но просто файл размером в гигабайт будет грузиться ну очень долго. Да и неэффективно это будет. Впрочем, загрузка файлов в пару-тройку десятков мегабайт будет незаметна и сейчас.
По остальному - ок, добавлю рекурсию. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Oct 05, 2010 12:50 Post subject: |
|
|
Batya
Речь о формировании временных файлов с текстом поиска/замены (в папке %TEMP%, по всей видимости). Или если какой-то более изощрённый способ?
Loopback wrote: | Тут уж ничего не поделаешь. Я поэтому все скрипты держу в исходниках, тогда достаточно одного экзешника. | Так в том-то и дело, что не достаточно, нужно аж пять дополнительных библиотек.
Loopback wrote: | Но просто файл размером в гигабайт будет грузиться ну очень долго. | У меня таких огромных нет и в ближайшие годы не предвидится. |
|
Back to top |
|
|
|
|
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
|