Замена фрагментов в выделенных файлах на счетчик

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Замена фрагментов в выделенных файлах на счетчик

Сообщение shveicar »

Здравствуйте.
Необходимо заменить определенные фрагменты в выделенном html и txt файле(файлах), на цифровые, - с увеличением по счетчику.
Например, в тексте тега (html) - идет фрагмент files/75139331.jpg, files/47156449.jpg и множество подобных.
Если в качестве поиска, использовать схему с регулярными выражениями, - то она будет выглядеть так:

Код: Выделить всё

	
files/([0-9]+).jpg

А в качестве замены, - нужно получить:
в первом попавшемся значении - files/001.jpg
во втором попавшемся значении - files/002.jpg и т.д до конца файла.
Желательно, для каждого файла - свой счетчик.
на всякий случай - вот сам файл
Надеюсь на помощь.

P.s проблема с одним файлом, была решена с помощью скрипта SearchReplace.js - действующего внутри AkelPad. Но если будет решение, сразу для нескольких файлов, без открытия в AkelPad - буду признателен.
Нашлось и решение с помощью Textpipe, но тоже, как позже выяснилось, - не полное :( ...
Так что вопрос пока открыт.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar писал(а):files/002.jpg и т.д до конца файла
А счётчик расти должен влево или вправо? 011 или 0011 ?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Flasher
Спасибо - что откликнулись.
Счетчик пусть растет влево,- до максимала (999).
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar
В файле (кот. по непонятной причине дважды упакован и ещё в b64 завёрнут) в строке, где встречается указанное вхождение, есть ещё аналогичные названия с префиксом prev. Что с этим делать?
И, кстати, зачем нули спереди?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Что с этим делать?
Так этот фрагмент, не имеет отношения к цифровой маске - или скрипт подразумевает обработку только под фрагмент с примером?
По идее - должно быть что то похожее на действие скрипта SearchReplace.js в программе AkeiPad с параметром поиска

Код: Выделить всё

files/([0-9]+).jpg
и замены на

Код: Выделить всё

var f = arguments.callee; var i = f.i || 0; f.i = ++i; return "files/photo_" + "000".substr(String(i).length) + i + ".jpg";
То есть, вместо диапазона фрагмента заданного в поиске, - можно подставить свой фрагмент со счетчиком.
И, кстати, зачем нули спереди?
В принципе, - это не критично, главное чтобы это цифровое значение было уникальным, - а файлы, всегда можно под него и потом переименовать. Если для сценария такой формат не удобен, - можно взять другой, - главное чтобы счетчик шёл по порядку.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar писал(а):Так этот фрагмент, не имеет отношения к цифровой маске - или скрипт подразумевает обработку только под фрагмент с примером?
Т.е. файлы типа 72744083prev.jpg в папке будут присутсвовать, а f72744083.jpg не будут? Где логика? И о каком примере речь?
shveicar писал(а):и замены на
Это код js со своими приблудами.
shveicar писал(а):В принципе, - это не критично
Тогда советую не усложнять то, что и так не просто делается.
Я до того как посмотрел на файл вообще не думал, что в строке будет куча требуемых вхождений, да ещё и в единственной. Т.е. найденную строку ещё разбивать на подстроки придётся. Получается двойной счётчик, с учётом того, что таких строк может быть несколько...
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Т.е. файлы типа 72744083prev.jpg в папке будут присутсвовать, а f72744083.jpg не будут?
Пример - в файле по ссылке. Будут присутствовать и те и другие, - просто сначала обрабатываются файлы вида

Код: Выделить всё

f72744083.jpg
- переименовываются на счетчик.
А после, повторным применением скрипта - второй волной, идет обработка,

Код: Выделить всё

72744083prev.jpg
уже со своим счетчиком, но по тому же сценарию.
Если делать все сразу - то счетчик будет идти не по порядку, поскольку изображения 72744083prev.jpg это миниатюрное производное из f72744083.jpg
Тогда советую не усложнять то, что и так не просто делается.
Конечно, Вам видней.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar
Хотелось изящества вроде приведённого выше кода, но так и не вышло. Сделал по старинке: сплиттингом и стандартной склейкой.

Код: Выделить всё

'==============================================================================
' Замена в сроках выделенных файлов части внутри заданного текстового диапазона
' на соответствующий вхождению номер с помощью регулярных выражений
'
' Параметры: %WL {начальная часть} {заменяемая часть} {завершающая часть}

' Пример:    %WL "files/" "([0-9]+)" "\.jpg"

' Автор: Flasher ©
'==============================================================================
With WScript.Arguments
  If .Count = 0 Then WScript.Quit
  List = .Item(0) : Before = .Item(1) : Middle = .Item(2) : After = .Item(3)
End With : L = vbNewLine
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1, -1).ReadAll, L)
  If F > vbNullString Then
    If FSO.FileExists(F) Then
      i = 0 : Text = "" : Str = "" : Full = "" : Set T = FSO.OpenTextFile(F)
      Do While Not T.AtEndOfStream
        Str = Trim(T.ReadLine)
        With New RegExp
          .IgnoreCase = True : .Global = True : .Pattern = Before & Middle & After
          If .Test(Str) Then
            C = .Execute(Str).Count
            If C > 1 Then
              Str = .Replace(Str, Before & L & Replace(After, "\", ""))
              For Each FStr in Split(Str, L)
                i = i + 1 : If i < 10 Then i = "00" & i
                If i > 9 And i < 100 Then i = "0" & i
                Full = Full & FStr & i
              Next : Str = Mid(Full, 1, Len(Full) - Len(i))
            ElseIf C = 1 Then
              i = i + 1 : If i < 10 Then i = "00" & i : If i > 9 And i < 100 Then i = "0" & i
              Str = .Replace(Str, Before & i & Replace(After, "\", ""))
            End If
          End If
        End With : Text = Text & L & Str
      Loop : T.Close : Set T = Nothing : FSO.OpenTextFile(F, 2).Write Mid(Text, 3)
    End If
  End If
Next : Set FSO = Nothing : WScript.Quit
Последний раз редактировалось Flasher Пн дек 03, 2012 00:47, всего редактировалось 2 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

С первого раза все срабатывает, вот если окошко ещё добавить с запросом на фрагменты, а то каждый паз в кнопку лезть, не совсем удобно.
Хотелось изящества
Да и так все нормально получилось, - остальные части, потом, без проблем можно поменять и в textpipe.
Большое Спасибо.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar писал(а):С первого раза все срабатывает, вот если окошко ещё добавить с запросом на фрагменты, а то каждый паз в кнопку лезть, не совсем удобно.
Это ж как надо разбираться в регулярках, чтобы вот так за секунды вставлять в каждое окно необходимое выражение без ошибок? :)
Это ещё с учётом того, что в синтаксисе для каждого языка/программы есть свои нюансы и тонкости.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Это ж как надо разбираться в регулярках,
Ну естественно, с простыми выражениями, - а более сложные нужно в тестовом прогоне проверять, - а то такое можно наворотить :wink:
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Как угодно. Поменять

Код: Выделить всё

With WScript.Arguments
  If .Count = 0 Then WScript.Quit
  List = .Item(0) : Before = .Item(1) : Middle = .Item(2) : After = .Item(3)
End With : L = vbNewLine
на

Код: Выделить всё

With WScript.Arguments
  If .Count = 0 Then WScript.Quit
  List = .Item(0)
End With : L = vbNewLine

IBox Before, "начальную", L : IBox Middle, "заменяемую", L : IBox After, "завершающую", L
Sub IBox(Name, NStr, NL)
  Name = InputBox(NL&NL&NL&NL&"Введите " & NStr & " искомую часть строки:",_
  "Замена текста в строках выбр. файлов на основе RegExp")
  If Trim(Name) = "" Then Wscript.Quit
End Sub
Последний раз редактировалось Flasher Вс дек 02, 2012 23:06, всего редактировалось 3 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Поменять
Странно, стал выдавать ошибку - строка 19 символ 1
Если правильно понял, то в поле всплывающих окон, значения добавляются в кавычках, как было в кнопке? или кавычки не нужны, хотя ошибка идет - так или иначе.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Забыл про сам список (%WL), поправил.
Кавычки - нет, не нужны.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Теперь процесс - пошел, только многие файлы суммируются, то есть идет сложение содержимого :shock: вот несколько файлов с этими фрагментами(до применения скрипта)...
Ответить