1 (изменено: DD, 2015-05-14 02:33:00)

Тема: AHK: Обработка чисел с определённым шагом

Привет!

Нарисовалась одна задачка по получению из ЖЖ-страниц — всех первых ссылок из веток со свёрнутыми комментариями, что таким образом позволит получить все свернутые коммы без дублей. Как выяснилось, основная трудность в отсеивании всех последующих коммов, идущих после первого в ветке.
Ниже представлен список всех свернутых коммов со страницы, в которых первое число с дефисом — это номер страницы и номер трэда, а второе — отступ в пикселях с шагом в "25". Первые числа с дефисом можно не учитывать, а делать выводы изходя из значения второго. Например, в списке (колонка "Суровая реальность") вторым числом сначала идёт 50, ниже идёт 75 (плюс 25), ниже идёт 100 (+25) и так далее до 500, после которого уже идёт 350 — что означает обрыв трэда на пятистах и что с трехсот пятидесяти начинается новый трэд. Т.е. задача в том, чтобы в места обрывов добавлять либо переводы строк (пустую строку), либо, в идеале, как можно видеть во второй колонке.



Суровая реальность                         Розовая мечта
------------------------------------------------------------------------------------------------
456456-3625396 50                         456456-3625396
456456-3627444 75
456456-3634100 100
456456-3634868 125
456456-3636916 150
456456-3637684 175
456456-3639220 200
456456-3639732 225
456456-3641524 250
456456-3642036 275
456456-3643316 300
456456-3643572 325
456456-3644340 350
456456-3644596 375
456456-3644852 400
456456-3645620 425
456456-3646388 450
456456-3647156 475
456456-3648948 500
456456-3649716 350                        456456-3649716
456456-3650228 375
456456-3650996 400
456456-3651508 425
456456-3638196 175                        456456-3638196
456456-3640756 200
456456-3642292 225
456456-3627188 25                         456456-3627188
456456-3637940 50
456456-3638708 75
456456-3643828 100

456456-3629748 50                         456456-3629748
456456-3630260 75
456456-3638964 50                         456456-3638964
456456-3639988 75

456456-3654324 50                         456456-3654324
456456-3654580 75
456456-3654836 100
456456-3727396 0                          456456-3727396
456456-3656372 75                         456456-3656372
456456-3656628 100
456456-3657652 125

456456-3655524 50                         456456-3655524

2

Re: AHK: Обработка чисел с определённым шагом

Обработать список - не проблема. А если такая ситуация, из твоего примера, допустим 2ой трэд начинается с 350, а 1ый заканчивается не на 500, а на 325,  как тогда определять границы?

+ DD

3

Re: AHK: Обработка чисел с определённым шагом

Если обойти пока этот аспект, то можно так:

sr =
(
456456-3625396 50
456456-3627444 75
456456-3634100 100
456456-3634868 125
456456-3636916 150
456456-3637684 175
456456-3639220 200
456456-3639732 225
456456-3641524 250
456456-3642036 275
456456-3643316 300
456456-3643572 325
456456-3644340 350
456456-3644596 375
456456-3644852 400
456456-3645620 425
456456-3646388 450
456456-3647156 475
456456-3648948 500
456456-3649716 350
456456-3650228 375
456456-3650996 400
456456-3651508 425
456456-3638196 175
456456-3640756 200
456456-3642292 225
456456-3627188 25
456456-3637940 50
456456-3638708 75
456456-3643828 100

456456-3629748 50
456456-3630260 75
456456-3638964 50
456456-3639988 75

456456-3654324 50
456456-3654580 75
456456-3654836 100
456456-3727396 0
456456-3656372 75
456456-3656628 100
456456-3657652 125

456456-3655524 50
)

Loop, Parse, sr, `r`n
   old:=v[2], v:=StrSplit(A_LoopField," "), v[1] && v[2]!=old+25 && rm .= v[1] . "`n"
MsgBox % rm

4 (изменено: DD, 2015-05-14 10:05:36)

Re: AHK: Обработка чисел с определённым шагом

Громадное спасибо, Irbis! А по твоему вопросу — вроде бы, насколько я смотрел и вникал, такая ситуация исключается, потому что если они будут следовать сразу друг за другом, без других коммов между ними, то это получится продолжение того же треда. Тогда как я вывожу командой (в программе PowerGREP) подряд все коммы в оригинальной последовательности (включая даже закрывающий тег HTML, чтобы даже от файла к файлу существовала граница), что в результатах выглядит так:


100592.html- 
100592.html- 
100592.html- 
100592.html- 
100592.html-825584 0(
100592.html- 
100592.html- 
100790.html- 
100790.html- 
100790.html-829622 50
100790.html-827062 0(
100790.html- 
100790.html- 
100790.html- 
100790.html- 
100790.html-828854 0(
100790.html- 
100790.html-832950 50(
100790.html-833974 75
100790.html- 
100790.html- 
100790.html- 
100790.html- 
100790.html-830902 25(
100790.html-831158 50
100790.html-831414 75
100790.html-831926 25
100790.html-832694 50
100790.html-841654 50
100790.html-842422 75
100790.html-854966 100
100790.html-855222 125
100790.html- 
100790.html- 
100790.html- 
100790.html-835254 0(
100790.html- 
100790.html- 

(Видимые кое-где скобки — это удалённые коммы — и в случаях, когда они с границами по сторонам, их нужно удалять перед обработкой скриптом.

или примерно так, если без замен, с простым выводом результатов:


<div id="ljcmt
<div id="ljcmt
<div id="ljcmt
<div id="ljcmt
<div  id="ljcmt3625396" style="margin-left: 50px">
<div  id="ljcmt3627444" style="margin-left: 75px">
<div  id="ljcmt3634100" style="margin-left: 100px">
<div  id="ljcmt3634868" style="margin-left: 125px">
<div  id="ljcmt3636916" style="margin-left: 150px">
<div  id="ljcmt3637684" style="margin-left: 175px">
<div  id="ljcmt3639220" style="margin-left: 200px">
<div  id="ljcmt3639732" style="margin-left: 225px">
<div  id="ljcmt3625652" style="margin-left: 50px">
<div  id="ljcmt3626932" style="margin-left: 75px">
<div  id="ljcmt3636404" style="margin-left: 100px">
<div  id="ljcmt3636660" style="margin-left: 125px">
<div  id="ljcmt3637172" style="margin-left: 150px">
<div  id="ljcmt3636148" style="margin-left: 75px">
<div  id="ljcmt3637428" style="margin-left: 100px">
<div  id="ljcmt3642548" style="margin-left: 125px">
<div  id="ljcmt3627188" style="margin-left: 25px">
<div  id="ljcmt3637940" style="margin-left: 50px">
<div  id="ljcmt3638708" style="margin-left: 75px">
<div  id="ljcmt3643828" style="margin-left: 100px">
<div  id="ljcmt3661236" style="margin-left: 125px">
<div  id="ljcmt3663284" style="margin-left: 150px">
<div  id="ljcmt3663796" style="margin-left: 175px">
<div  id="ljcmt3665076" style="margin-left: 200px">
<div id="ljcmt
<div  id="ljcmt3629748" style="margin-left: 50px">
<div  id="ljcmt3630260" style="margin-left: 75px">
<div  id="ljcmt3638964" style="margin-left: 50px">
<div  id="ljcmt3639988" style="margin-left: 75px">
<div id="ljcmt
<div id="ljcmt
<div  id="ljcmt3654324" style="margin-left: 50px">
<div  id="ljcmt3654580" style="margin-left: 75px">
<div  id="ljcmt3654836" style="margin-left: 100px">
<div  id="ljcmt3656372" style="margin-left: 75px">
<div  id="ljcmt3656628" style="margin-left: 100px">
<div  id="ljcmt3657652" style="margin-left: 125px">
<div  id="ljcmt3660212" style="margin-left: 150px">
<div  id="ljcmt3662260" style="margin-left: 175px">
<div id="ljcmt
<div id="ljcmt
<div id="ljcmt
<div id="ljcmt
<div  id="ljcmt3657396" style="margin-left: 75px">
<div  id="ljcmt3657908" style="margin-left: 100px">
<div  id="ljcmt3658676" style="margin-left: 125px">
<div  id="ljcmt3658932" style="margin-left: 150px">
<div id="ljcmt
<div  id="ljcmt3626420" style="margin-left: 25px">
<div  id="ljcmt3626676" style="margin-left: 50px">
<div  id="ljcmt3628724" style="margin-left: 75px">
<div  id="ljcmt3631284" style="margin-left: 100px">
<div  id="ljcmt3631796" style="margin-left: 125px">
<div  id="ljcmt3661492" style="margin-left: 475px">
<div  id="ljcmt3662516" style="margin-left: 475px">
<div  id="ljcmt3632820" style="margin-left: 100px">
<div  id="ljcmt3633588" style="margin-left: 125px">
<div  id="ljcmt3635124" style="margin-left: 150px">
<div  id="ljcmt3640500" style="margin-left: 175px">
<div  id="ljcmt3645876" style="margin-left: 200px">
<div  id="ljcmt3655348" style="margin-left: 225px">
<div  id="ljcmt3641780" style="margin-left: 75px">
<div  id="ljcmt3648436" style="margin-left: 100px">
<div id="ljcmt
<div  id="ljcmt3629236" style="margin-left: 50px">
<div  id="ljcmt3629492" style="margin-left: 75px">
<div  id="ljcmt3630772" style="margin-left: 100px">
<div  id="ljcmt3631028" style="margin-left: 125px">
<div  id="ljcmt3632052" style="margin-left: 50px">
<div  id="ljcmt3632564" style="margin-left: 75px">
<div  id="ljcmt3641012" style="margin-left: 75px">
<div  id="ljcmt3647668" style="margin-left: 100px">
<div  id="ljcmt3650740" style="margin-left: 125px">
<div id="ljcmt
<div  id="ljcmt3630516" style="margin-left: 50px">
<div  id="ljcmt3634356" style="margin-left: 50px">
<div id="ljcmt
<div  id="ljcmt3644084" style="margin-left: 50px">
<div id="ljcmt
<div  id="ljcmt3649460" style="margin-left: 50px">
<div  id="ljcmt3650484" style="margin-left: 75px">
<div  id="ljcmt3651252" style="margin-left: 100px">
<div  id="ljcmt3660724" style="margin-left: 125px">
<div id="ljcmt
<div  id="ljcmt3646900" style="margin-left: 25px">
<div id="ljcmt
<div  id="ljcmt3649972" style="margin-left: 75px">
<div  id="ljcmt3652276" style="margin-left: 100px">
<div id="ljcmt
<div id="ljcmt
<div id="ljcmt
<div id="ljcmt

Т.е. в списке коммы с одним пробелом после DIV — это развернутые коммы, а с двумя — свёрнутые.

5

Re: AHK: Обработка чисел с определённым шагом

Вопрос возник по скрипту: когда список читается из файла, он почему-то не обрабатывается —

FileRead, sr, %a_desktop%\TMP.TXT

Loop, Parse, sr, `r`n
   old:=v[2], v:=StrSplit(A_LoopField," "), v[1] && v[2]!=old+25 && rm .= v[1] . "`n"

FileAppend % rm, %a_desktop%\TRDS.TXT

Может директива какая нужна?

6 (изменено: _gruz, 2015-05-17 01:22:04)

Re: AHK: Обработка чисел с определённым шагом

Из файла там наверное символ завершения строки другой. Попробуй так:

FileRead, sr, *t %a_desktop%\TMP.TXT

и

Loop, Parse, sr, `n

Опция *t: заменяет все пары символов возврата каретки и перевода строки (`r`n) на переводы строки (`n).
Или только в цикле поменять на то, что нужно, в зависимости от ОС, но тогда если поставить для цикла только один вариант переноса строки, то в другой ОС не будет работать. тут или как в начале я указал, или рег. выражения использовать (или опцию ИЛИ).

А почему не использовать регулярные выражения, тогда гибкость и масштабированность намного больше была бы.

+ DD

7

Re: AHK: Обработка чисел с определённым шагом

Точно, _gruz, я и забыл об этом)) Но гибкость и сейчас вроде вполне себе гибкая — но разве регулярными можно обрабатывать числовые шаги?

8

Re: AHK: Обработка чисел с определённым шагом

sr =
(
456456-3625396 50
456456-3627444 75
456456-3634100 100
456456-3634868 125
456456-3636916 150
456456-3637684 175
456456-3639220 200
456456-3639732 225
456456-3641524 250
456456-3642036 275
456456-3643316 300
456456-3643572 325
456456-3644340 350
456456-3644596 375
456456-3644852 400
456456-3645620 425
456456-3646388 450
456456-3647156 475
456456-3648948 500
456456-3649716 350
456456-3650228 375
456456-3650996 400
456456-3651508 425
456456-3638196 175
456456-3640756 200
456456-3642292 225
456456-3627188 25
456456-3637940 50
456456-3638708 75
456456-3643828 100

456456-3629748 50
456456-3630260 75
456456-3638964 50
456456-3639988 75

456456-3654324 50
456456-3654580 75
456456-3654836 100
456456-3727396 0
456456-3656372 75
456456-3656628 100
456456-3657652 125

456456-3655524 50
)
Pos := 1
While Pos := RegExMatch(sr, "s)(\d+-\d+) (\d+)",match,Pos+StrLen(match))
{
   if (match2 - 25 != matchPrev)
      rm .= match1 "`n"
   matchPrev := match2
}
msgbox % rm
+ DD

9

Re: AHK: Обработка чисел с определённым шагом

Так понимаю, совмещён массив с регулярными? Интересно, спасибо.

10

Re: AHK: Обработка чисел с определённым шагом

Нету там массива, только регулярное.

11

Re: AHK: Обработка чисел с определённым шагом

Означает ли это, что и в Notepad++, указав шаблон, можно обрабатывать подобные списки?

12

Re: AHK: Обработка чисел с определённым шагом

Тут надо спрашивать у продвинутых пользователей notepad++.

13 (изменено: _gruz, 2015-05-19 21:07:07)

Re: AHK: Обработка чисел с определённым шагом

Если есть опция регулярные строки или что то подобное в опциях, то конечно, синтаксис везде стандартизирован (за искл. нескольких нюансов).
Вышеуказанный шаблон всего лишь возвращает или числа с первой группы ("456456-3657652") или числа, строки с второй: (напр "125"), если я не ошибаюсь. При чем если будет разделитель не пробел а табуляция, он уже не сработает. Не придумал пока как можно в регулярке проверять, на сколько одно число больше другого
Не знаю на счет Notepad++ но однозначно посоветовал бы AkelPad -- кроме станд. ф-ций он основан на плагинах (JScript которые легко можно самому добавлять -- есть шаблон с комментами), в которых можно практически ВСЕ.

+ открыть спойлер

http://maxbeting.com/1-1.jpg

14 (изменено: DD, 2018-04-10 13:59:52)

Re: AHK: Обработка чисел с определённым шагом