Страница 1 из 2
Замена фрагментов в выделенных файлах на счетчик
Добавлено: Чт ноя 29, 2012 19:15
shveicar
Здравствуйте.
Необходимо заменить определенные фрагменты в выделенном html и txt файле(файлах), на цифровые, - с увеличением по счетчику.
Например, в тексте тега (html) - идет фрагмент files/75139331.jpg, files/47156449.jpg и множество подобных.
Если в качестве поиска, использовать схему с регулярными выражениями, - то она будет выглядеть так:
А в качестве замены, - нужно получить:
в первом попавшемся значении - files/001.jpg
во втором попавшемся значении - files/002.jpg и т.д до конца файла.
Желательно, для каждого файла - свой счетчик.
на всякий случай - вот сам
файл
Надеюсь на помощь.
P.s проблема с одним файлом, была решена с помощью скрипта SearchReplace.js - действующего внутри AkelPad. Но если будет решение, сразу для нескольких файлов, без открытия в AkelPad - буду признателен.
Нашлось и решение с помощью Textpipe, но тоже, как позже выяснилось, - не полное

...
Так что вопрос пока открыт.
Добавлено: Вс дек 02, 2012 13:15
Flasher
shveicar писал(а):files/002.jpg и т.д до конца файла
А счётчик расти должен влево или вправо? 011 или 0011 ?
Добавлено: Вс дек 02, 2012 14:20
shveicar
Flasher
Спасибо - что откликнулись.
Счетчик пусть растет влево,- до максимала (999).
Добавлено: Вс дек 02, 2012 17:14
Flasher
shveicar
В файле (кот. по непонятной причине дважды упакован и ещё в b64 завёрнут) в строке, где встречается указанное вхождение, есть ещё аналогичные названия с префиксом prev. Что с этим делать?
И, кстати, зачем нули спереди?
Добавлено: Вс дек 02, 2012 17:34
shveicar
Что с этим делать?
Так этот фрагмент, не имеет отношения к цифровой маске - или скрипт подразумевает обработку только под фрагмент с примером?
По идее - должно быть что то похожее на действие скрипта SearchReplace.js в программе AkeiPad с параметром поиска
и замены на
Код: Выделить всё
var f = arguments.callee; var i = f.i || 0; f.i = ++i; return "files/photo_" + "000".substr(String(i).length) + i + ".jpg";
То есть, вместо диапазона фрагмента заданного в поиске, - можно подставить свой фрагмент со счетчиком.
И, кстати, зачем нули спереди?
В принципе, - это не критично, главное чтобы это цифровое значение было уникальным, - а файлы, всегда можно под него и потом переименовать. Если для сценария такой формат не удобен, - можно взять другой, - главное чтобы счетчик шёл по порядку.
Добавлено: Вс дек 02, 2012 17:43
Flasher
shveicar писал(а):Так этот фрагмент, не имеет отношения к цифровой маске - или скрипт подразумевает обработку только под фрагмент с примером?
Т.е. файлы типа 72744083prev.jpg в папке будут присутсвовать, а f72744083.jpg не будут? Где логика? И о каком примере речь?
shveicar писал(а):и замены на
Это код js со своими приблудами.
shveicar писал(а):В принципе, - это не критично
Тогда советую не усложнять то, что и так не просто делается.
Я до того как посмотрел на файл вообще не думал, что в строке будет куча требуемых вхождений, да ещё и в единственной. Т.е. найденную строку ещё разбивать на подстроки придётся. Получается двойной счётчик, с учётом того, что таких строк может быть несколько...
Добавлено: Вс дек 02, 2012 18:19
shveicar
Т.е. файлы типа 72744083prev.jpg в папке будут присутсвовать, а f72744083.jpg не будут?
Пример - в файле по ссылке. Будут присутствовать и те и другие, - просто сначала обрабатываются файлы вида
- переименовываются на счетчик.
А после, повторным применением скрипта - второй волной, идет обработка,
уже со своим счетчиком, но по тому же сценарию.
Если делать все сразу - то счетчик будет идти не по порядку, поскольку изображения 72744083prev.jpg это миниатюрное производное из f72744083.jpg
Тогда советую не усложнять то, что и так не просто делается.
Конечно, Вам видней.
Добавлено: Вс дек 02, 2012 21:11
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
Добавлено: Вс дек 02, 2012 21:31
shveicar
С первого раза все срабатывает, вот если окошко ещё добавить с запросом на фрагменты, а то каждый паз в кнопку лезть, не совсем удобно.
Хотелось изящества
Да и так все нормально получилось, - остальные части, потом, без проблем можно поменять и в textpipe.
Большое Спасибо.
Добавлено: Вс дек 02, 2012 21:40
Flasher
shveicar писал(а):С первого раза все срабатывает, вот если окошко ещё добавить с запросом на фрагменты, а то каждый паз в кнопку лезть, не совсем удобно.
Это ж как надо разбираться в регулярках, чтобы вот так за секунды вставлять в каждое окно необходимое выражение без ошибок?

Это ещё с учётом того, что в синтаксисе для каждого языка/программы есть свои нюансы и тонкости.
Добавлено: Вс дек 02, 2012 21:45
shveicar
Это ж как надо разбираться в регулярках,
Ну естественно, с простыми выражениями, - а более сложные нужно в тестовом прогоне проверять, - а то такое можно наворотить

Добавлено: Вс дек 02, 2012 22:15
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
Добавлено: Вс дек 02, 2012 22:46
shveicar
Поменять
Странно, стал выдавать ошибку - строка 19 символ 1
Если правильно понял, то в поле всплывающих окон, значения добавляются в кавычках, как было в кнопке? или кавычки не нужны, хотя ошибка идет - так или иначе.
Добавлено: Вс дек 02, 2012 22:54
Flasher
Забыл про сам список (%WL), поправил.
Кавычки - нет, не нужны.
Добавлено: Пн дек 03, 2012 00:06
shveicar
Теперь процесс - пошел, только многие файлы суммируются, то есть идет сложение содержимого

вот несколько
файлов с этими фрагментами(до применения скрипта)...