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 Previous  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
Samwatas



Joined: 12 Sep 2009
Posts: 95

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

Rodny wrote:

P.P.S. Поскольку с AutoIt'ом сталкиваться ещё не доводилось, ставить/компилировать несколько напряжно, если можно будет обойтись vbs, это предпочтительнее.

Напрасно, в АвтоИте есть функции предназначенные специально для работы с секциями ИНИ-файлов, как виндовые АПИ (поэтому написать такой скрипт будет легче всего).
Back to top
View user's profile Send private message
Flasher



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

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

Loopback
Да Бог с тобой, какая экселевская.. Very Happy Я о расположении самих окошек говорю с левой стороны. Комбинации(строка/столбец): 1x2, 2x2, 3x2, 3x3. В строку тоже ничего, но так, действительно, растянется по высоте. Если другого не дано, то, что тут поделаешь.. Smile
Окно справа пусть целиком до низа будет растянуто, если можно.
Back to top
View user's profile Send private message
Batya



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

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

Flasher wrote:
Так, окей, уже лучше, а что с табуляцией делать?

Хм, ну тогда:
Code:
With CreateObject("TCScript.Helper")
  .SetTextToClip(Replace(Replace(.GetTextFromClip, vbNewLine, "\n"), vbTab, "\t"))
End With

...

Find_String = Replace(Replace(Find_String, "\n", vbNewLine), "\t", vbTab)

...

Replace_String = Replace(Replace(Replace_String, "\n", vbNewLine), "\t", vbTab)

_________________
Нет, я не сплю. Я просто медленно моргаю.


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



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

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

Rodny wrote:
У меня проблема в том, что я точно знаю только название секции, т. е. я не могу здесь задать строки для поиска.
А что мешает открыть оба инишника и скопипастить целиком секции в каждое окошко и осуществить замену? Или это так часто требуется?
Добавлено: хотя нет, я тут подумал, что этот способ мало отличим от замены ручками в редакторе. Тогда, конечно, нужно искать другой способ.

Batya wrote:
Code:
.SetTextToClip(Replace(Replace(.GetTextFromClip, vbNewLine, "\n")), vbTab, "\t"))
Что-то на скобки ругается, не пойму почему. Confused
Back to top
View user's profile Send private message
Batya



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

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

Flasher wrote:
Что-то на скобки ругается

Исправил.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Rodny



Joined: 24 Jan 2007
Posts: 949
Location: Могилёв, Беларусь

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

Samwatas wrote:
Напрасно, в АвтоИте есть функции предназначенные специально для работы с секциями ИНИ-файлов, как виндовые АПИ (поэтому написать такой скрипт будет легче всего).

Похоже на то. То, что я поначалу принял за решение, оказалось функциями для VB(A), использующими соответствующие из WinAPI. В VBS, насколько я понял, с этим туго, народ построчно файлы перебирает.

Граждане АвтоИтовцы, если не трудно?..
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

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

Ставь конкретней задачу: с какими параметрами желаешь вызывать утиль, где хранить имя (имена) секции(й) (можно тоже в ини-файле, только в своём, а при старте утилиты подгружать), поведение утилиты при отклонениях от плана (например в первом файле не оказалось секции с данным именем, или секция пустая) и т.д.
В общем чем подробнее, тем лучше (может тебе хотелось бы видеть какие-то дополнительные опции).


Last edited by Samwatas on Tue Oct 05, 2010 18:16; edited 2 times in total
Back to top
View user's profile Send private message
Batya



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

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

Rodny wrote:
В VBS, насколько я понял, с этим туго, народ построчно файлы перебирает.

Если у тебя установлен TCScript.Helper, то можешь воспользоваться демо-скриптом DemoScripts\ReadWriteSection.vbs, идущим вместе со TCScript.Helper.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

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

Без проверок на ошибки и доп. опций скрипт занимает 1 строчку:
Code:
IniWriteSection("C:\Temp2.ini", "section2", IniReadSection("C:\Temp1.ini", "section1"))


C:\Temp1.ini - первый инишник, из которого мы будем читать секцию.
C:\Temp2.ini - второй инишник, в который мы будем писать секцию.
section1 - имя секции, которую мы будем читать из первого файла.
section2 - имя секции, в которую мы будем писать во втором файле (может совпадать с именем первой секции, если необходимо, а может иметь и другое имя).
Если секцию во втором файле требуется предварительно удалить, то есть функция IniDelete("filename", "section") - просто вставь её первой в скрипт (естественно, прописав нужное имя файла и секции).

П.С. Тут кто-то недавно говорил, что все скриптовые языки имеют примерно равный функционал. Ну-ну..
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1291

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

Flasher
Ну вот, последний на сегодня вариант Smile Параметры интерфейса можно задать в начале скрипта, думаю там все понятно.

Code:

#include <GUIConstantsEx.au3>

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

; ================================
; Настройки отображения интерфейса
; ================================
; Число полей поиска
Global Const $gSrcCount = 3
; Высота одного поля
Global Const $gSrcHeight = 120
; ================================

Global $aList  = _TCHLoadFileList($CmdLine[1])
Global $gReplaces = 0, $gMask
Global $gSrcEdit[$gSrcCount]
Global $nGUIHeight = $gSrcHeight * $gSrcCount + 109

$hGUI = GUICreate("Поиск и замена", 563, $nGUIHeight, -1, @DesktopHeight/2 - $nGUIHeight/2)
GUICtrlCreateLabel("Маска файлов", 8, 6, 78, 17)
$edMask = GUICtrlCreateInput("*.*", 8, 24, 265, 21)
GUICtrlCreateLabel("Текст для поиска", 8, 54, 94, 17)
GUICtrlCreateLabel("Текст для замены", 288, 54, 98, 17)

For $i = 0 To $gSrcCount - 1
    $gSrcEdit[$i] = GUICtrlCreateEdit("", 8, 72 + $gSrcHeight * $i, 265, $gSrcHeight)
Next

$edTrg = GUICtrlCreateEdit("", 288, 72, 265, $gSrcHeight * $gSrcCount)
$cbCaseSence = GUICtrlCreateCheckbox("Учитывать регистр", 8, $gSrcHeight * $gSrcCount + 84, 137, 17)
$btnOK = GUICtrlCreateButton("OK", 400, $gSrcHeight * $gSrcCount + 79, 75, 25)
$btnCancel = GUICtrlCreateButton("Отмена", 480, $gSrcHeight * $gSrcCount + 79, 75, 25)
GUISetState(@SW_SHOW)

If $aList[0] = 0 Then GUICtrlSetState($btnOK, $GUI_DISABLE)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE, $btnCancel
        Exit
      Case $btnOK
        $gMask = _MaskToRegexp(GUICtrlRead($edMask))
        For $i = 1 To $aList[0]
            If StringRight($aList[$i], 1) = "\" Then
                _DoFolder($aList[$i])
            Else
                _DoFile($aList[$i])
            EndIf
        Next
        MsgBox (0, "", "Выполнено замен: " & $gReplaces, 0, $hGUI)
        Exit
   EndSwitch
WEnd

Func _DoFolder($sFolder)
    If $sFolder = "" Then Return
    Local $sDirs = ""
    Local $hSearch = FileFindFirstFile($sFolder & "*.*")
    If @error Then Return
    While 1
        $sFile = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        If @extended Then
            $sDirs &= $sFolder & $sFile & "\" & @LF
            ContinueLoop
        EndIf
        _DoFile($sFolder & $sFile)
    Wend
    FileClose($hSearch)
    ; Обработку каталогов приходится делать отдельно,
    ; чтобы не оставлять открытый поисковый хэндл,
    ; их максимально может быть 64
    $aDirs = StringSplit($sDirs, @LF)
    For $i = 1 To $aDirs[0]
        _DoFolder($aDirs[$i])
    Next
EndFunc

Func _DoFile($sFile)
    If StringRegExp($sFile, $gMask) = 0 Then Return
    Local $sText = FileRead($sFile)
    Local $sSrc
    MsgBox(0, "title", $sText)
    Local $nReplaces = 0
    For $i = 0 To $gSrcCount - 1
        $sSrc = GUICtrlRead($gSrcEdit[$i])
        If $sSrc = "" Then ContinueLoop
        $sText = StringReplace($sText, $sSrc, GUICtrlRead($edTrg), 0, _
                               BitAND(GUICtrlRead($cbCaseSence), $GUI_CHECKED))
        $nReplaces += @extended
    Next
    If $nReplaces = 0 Then Return
    $gReplaces += $nReplaces
    Local $hFile = FileOpen($sFile, 2)
    FileWrite($hFile, $sText)
    FileClose($hFile)
EndFunc

Func _MaskToRegexp($sMask)
    $sMask = StringRegExpReplace($sMask, "(\\|\.|\+|\^|\(|\)|\[|\]|\{|\}|\$)", "\\\1")
    $sMask = StringReplace($sMask, "?", ".")
    $sMask = StringReplace($sMask, "*", ".+?")
    Return("(?i)^" & $sMask & "$")
EndFunc

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
Rodny



Joined: 24 Jan 2007
Posts: 949
Location: Могилёв, Беларусь

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

Batya
Спасибо, самое то. Надо будет всё-таки прочитать ридми дальше, чем до SendCommand Embarassed

Samwatas
Спасибо, для моих скромных нужд хелпера пока вполне хватит. У меня мало-мальски опыт с VB есть, а вот на знакомство с автоитом пока времени взять негде.
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

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

Quote:
Lev
Дык, по-моему, тоже со строками только работает.

По-твоему.
Переведи на русский слово Multiline.
Ответь на вопрос - зачем в регекспах всякие: ^ Line start, $ Line end, \r, \n при построчной работе?
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Wed Oct 06, 2010 04:52    Post subject: Reply with quote

Loopback
С таблицей, я так понял, не получилось, жаль.
Loopback wrote:
Параметры интерфейса можно задать в начале скрипта, думаю там все понятно.
Э..э, а как же?:
Flasher wrote:
хотелось бы (если это возможно) разбивать левое окно на заданное в параметрах кол-во частей
Я же не буду для каждого случая компилить a3x-файл Smile .
Idea А ещё лучше, если сперва будет появляться маленькое окошко с 6-9 кнопочками с номерами, при нажатии на каждое из которых будет появляться окно, где левая часть разбита на сопоставленное с номером кол-во частей.

Lev
Ок, с этим всё понятно. Если есть возможность, сделай скрипт по аналогии со скриптом Volniy(+Batya) с использованием VBScript.RegExp и objRegExp.Multiline, а мы оценим.
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

Post (Separately) Posted: Wed Oct 06, 2010 13:10    Post subject: Reply with quote

Скопируй содержимое файла GUIConstantsEx.au3 в свой файл скрипта (можно также проредить его, удалив неиспользуемые константы), соответственно не нужно будет ничего компилить.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Wed Oct 06, 2010 13:18    Post subject: Reply with quote

Это ситуацию никак не изменит, фактически будут те же грабли по временным затратам.
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 Previous  1, 2, 3, 4, 5, 6, 7, 8, 9  Next
Page 3 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