поиск и замена

Russian main discussion
  • Author
  • Message
Offline
Posts: 2
Joined: Fri Mar 13, 2015 8:49 pm

перемножение во множестве текстовых файлов не трогая текст

Post by zverevkr »

Скажите, можно ли решить следующую задачу используя akelpad и скрипты(плагины)?
Есть текстовые файлы(несколько десятков), в них есть по сотне записей с группами, в группах расписаны шансы на выпадение самой группы, а так же внутри каждой из групп есть индивидуальные шансы на каждый итем входящий в эту группу, нужно привести множество текстовых файлов, содержащих такие строки ко второму виду, где индивидуально раписаны шансы каждого итема. И этот шанс получен перемножением индивидуального шанса этого итема на шанс группы в которой этот итем находится. Не трогая остальной текст, содержащийся в файлах. Строки с групповыми шансами можно не удалять(если сделать это после, создав единую группу с шансом 100% на каждый список итемов).

некий текст
<group chance=«aa»>
<текст итема1" chance=«bb» />
</group>
<group chance=«cc»>
<текст итема2 " chance=«dd» />
<текст итема3 " chance=«ee» />
<текст итема4 " chance=«ff» />
<текст итема5 " chance=«gg» />
</group>
<group chance=«hh»>
<текст итема6 " chance=«ii» />
<текст итема7 " chance=«jj» />
</group>
некий текст


Сделать из записи вида:
group 1 =60%
item 1 = 20%
item 2 = 80%
group 2 = 50%
item 3 = 10%
item 4 = 30%
item 5 = 20%
item 6 = 2%
group 3 = 20%
item 7 = 90%
item 8 = 80%
Такую запись:
item1 = 12%
item2 = 48%
item3 = 5%
item4 = 15%
item5 = 10%
item6 = 1%
item7 = 18%
item8 = 16%


некий текст
<group chance=«aa»>
<текст итема1 " chance=«aa*bb» />
</group>
<group chance=«cc»>
<текст итема2 " chance=«cc*dd» />
<текст итема3 " chance=«cc*ee» />
<текст итема4 " chance=«cc*ff» />
<текст итема5 " chance=«cc*gg» />
</group>
<group chance=«hh»>
<текст итема6 " chance=«hh*ii» />
<текст итема7 " chance=«hh*jj» />
</group>
некий текст


некий текст
<group chance=«100%»>
<текст итема1 " chance=«aa*bb» />
<текст итема2 " chance=«cc*dd» />
<текст итема3 " chance=«cc*ee» />
<текст итема4 " chance=«cc*ff» />
<текст итема5 " chance=«cc*gg» />
<текст итема6 " chance=«hh*ii» />
<текст итема7 " chance=«hh*jj» />
</group>
некий текст

При этом aa*bb должно быть непосредственно результатом перемножения.
Примерный алгоритм, возможно совершенно не верный, просто то, что мне пришло в голову..
0) переменная «групшанс» по умолчанию =1
1)читаю текст, нахожу фразу group chance, считываю всё, что после =" и до второй " в переменную «групшанс»
1.5)умножаю переменную «групшанс» на 0.01(так как надо значение в процентах перевести в значение в долях то есть 100% = 1, 50%=0.5, 0.5%=0.005 и тд)
2)далее умножаю встречающееся мне число, расположенное после " chance=" и до второй кавычки " на переменную «групшанс» и перезаписываю полученный результат вместо исходного числа
3)далее проверяю, нет ли строки group chance, если есть, то возвращаюсь к пункту 1), если нет, то к пункту 2), если же встречаю фразу </group> то записываю в переменную «групшанс» число 1[more=""]

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

zverevkr
можно.
для этого даже акелпад не нужен, можно запускать эти скрипты (.js/.wsh/.bat) и без него.

Offline
Posts: 2
Joined: Fri Mar 13, 2015 8:49 pm

Post by zverevkr »

Drugmix wrote:zverevkr
можно.
для этого даже акелпад не нужен, можно запускать эти скрипты (.js/.wsh/.bat) и без него.
а может кто-нибудь помочь составить такой скрипт?

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

zverevkr
может, но для этого лучше спросить на соответствующих данной тематике форумах.

Offline
Posts: 6
Joined: Thu Apr 09, 2015 10:37 am

Post by Dimon485 »

Подскажите пожалуйста, как заменить в тексте скобки в виде слэша на квадратные. То есть вот так:
/текст/ -> [текст]

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Dimon485
Replace dialog with "Regular expressions":
What: /([^/]+)/
With: [\1]

Offline
Posts: 6
Joined: Thu Apr 09, 2015 10:37 am

Post by Dimon485 »

KDJ, thanx a lot! It`s just a miracle! =)

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Помогите, пожалуйста, задачку решить. Подозреваю, что это возможно через «Заменить на функцию». Нужно найти в тексте диапазон <a>...</a>, внутри него найти диапазон <b>...</b> и внутри второго диапазона произвести замены.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

yozhic
In standard "Replace" dialog (with Regular expressions), try this:
What: (<a>.*?<b>).*?(</b>.*?</a>)
With: \1NewText\2

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

KDJ
Понял, надо подробнее изложить. Есть текст

Code: Select all

<c>...</c> 
... <a>
 <c>...</c>
 <c>...</c>
  <b> ...
   <c>...</c>
   <c>...</c>
  </b>
 <c>...</c>
 <c>...</c>
  <b> ...
   <c>...</c>
   <c>...</c>
  </b>
 <c>...</c>
 <c>...</c>
</a>
<c>...</c>
. Нужно заменить только те <c>, которые находятся внутри диапазонов <b> и внутри <a>. Я пробовал так:

What: (<a>.*?<b>)(.*?)(</b>.*?</a>)
With: return arguments[1] + arguments[2].replace(/<c>/g, "<d>") + arguments[3];

Но так замены происходят только в первом диапазоне <b>, при этом второй не затрагивается. А нужно, чтобы заменяло во всех диапазонах <b> внутри <a>, причём таких диапазонов <b> внутри <a> может быть несколько (больше двух). Возможно ли это решить одной функцией? Если нет, то буду тогда изменять теги <b> при каждом проходе и так, в несколько проходов, обработаю весь текст. Просто хотелось узнать, существует ли более изящное решение :)

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

yozhic wrote:Просто хотелось узнать, существует ли более изящное решение :)
Изящным решение не назову, т.к. в один проход такую замену осуществить непросто, но как вариант:

Code: Select all

Что: <a>.*?<b>.*?\K(<c>[^<]*</c>)(?=.*?</b>.*?</a>)
Чем: <d>NewText</d>
- добавляем в пакет (FindReplaceEx.js) несколько раз этот шаблон (чем больше, тем меньше вероятность пропуска нужного сочетания), затем запускаем и для уверенности проверяем дублированием запуска этого пакета.

Добавлено:
У этого шаблона существенный недостаток:

Code: Select all

  <b> ... 
   <c>...</c> 
   <c>...</c> 
  </b> 
 <c>...</c> 
 <c>...</c> 
  <b> ... 
   <c>...</c> 
   <c>...</c> 
  </b>

- здесь будут захвачены абсолютно все "<c>...</c>", т.к. в итоге они находятся между первым тегом "<b>" и последним "</b>". Способа обойти это не нашел.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

yozhic
Script SearchReplace.js:
+Regular expressions
+Replace with function
What: (<a>)([\s\S]*?)(</a>)
With: return $1 + ($2).replace(/<b>[\s\S]*?<\/b>/g, "<b>" + "NewText" + "<\/b>") + $3;

Offline
Posts: 6
Joined: Wed May 20, 2015 9:36 am

Вопрос по функционалу: копирование и вставка в нужные поля

Post by ezjikfrom »

Добрый день, подскажите, пожалуйста:
Нужно в xml скопировать в каждом товаре значение из поля url этого товара в значение поля discription этого же товара. Товаров много, т.е. система должна искать поле урл, копировать инфу оттуда (в идеале только то, что находится между <url> и </url>) и эту инфу вставлять после <discription>.
Подскажите, пожалуйста, как это сделать в AkelPade

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Заменить <url> и </url> на <discription> и </discription> ?

Offline
Posts: 6
Joined: Wed May 20, 2015 9:36 am

Post by ezjikfrom »

Нет, не так все просто, к сожалению)
Пункт url мне надо оставить на своем месте, а просто значение оттуда (адрес страницы) скопировать в description, добавить уже к имеющейся информации в description. А такая замена уберет существующий <description> и <url>, что недопустимо для меня.