Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Необходимо найти все строки которые начинаются с "download:"https:" и заканчиваются

Ответить
Настройки темы
VBS/WSH/JS - [решено] Необходимо найти все строки которые начинаются с "download:"https:" и заканчиваются

Аватара для angel_lyucifer

Старожил


Сообщения: 169
Благодарности: 4


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте, нужна ваша помощь.
Есть текстовый файл сгенерированный программой, вид содержимого файла:
Код: Выделить весь код
{'title':'Эпизод 1', 'file':'[1080p]//de2.anilibria.tv/videos/ts/8374/0001-hd/playlist.m3u8,[720p]//de2.anilibria.tv/videos/ts/8374/0001/playlist.m3u8,[480p]//de2.anilibria.tv/videos/ts/8374/0001-sd/playlist.m3u8', download:"https://x.anilibria.tv/get/3BdXdlP0bs4wlKyjQcXZpA/1557795967/mp4/8374/0001.mp4?download=Hitoribocchi no Marumaru Seikatsu-1-sd.mp4", 'id': 's1'},
{'title':'Эпизод 2', 'file':'[1080p]//de2.anilibria.tv/videos/ts/8374/0002-hd/playlist.m3u8,[720p]//de2.anilibria.tv/videos/ts/8374/0002/playlist.m3u8,[480p]//de2.anilibria.tv/videos/ts/8374/0002-sd/playlist.m3u8', download:"https://x.anilibria.tv/get/ciP3toJ3rI3-x25Rqxxa0g/1557795967/mp4/8374/0002.mp4?download=Hitoribocchi no Marumaru Seikatsu-2-sd.mp4", 'id': 's2'},
{'title':'Эпизод 3', 'file':'[1080p]//de2.anilibria.tv/videos/ts/8374/0003-hd/playlist.m3u8,[720p]//de2.anilibria.tv/videos/ts/8374/0003/playlist.m3u8,[480p]//de2.anilibria.tv/videos/ts/8374/0003-sd/playlist.m3u8', download:"https://x.anilibria.tv/get/2xTCA5dY7tiA634RtlXrTw/1557795967/mp4/8374/0003.mp4?download=Hitoribocchi no Marumaru Seikatsu-3-sd.mp4", 'id': 's3'},
{'title':'Эпизод 4', 'file':'[1080p]//de2.anilibria.tv/videos/ts/8374/0004-hd/playlist.m3u8,[720p]//de2.anilibria.tv/videos/ts/8374/0004/playlist.m3u8,[480p]//de2.anilibria.tv/videos/ts/8374/0004-sd/playlist.m3u8', download:"https://x.anilibria.tv/get/Zgk0waIDnyzpgH4K3QM1hw/1557795967/mp4/8374/0004.mp4?download=Hitoribocchi no Marumaru Seikatsu-4-sd.mp4", 'id': 's4'},
{'title':'Эпизод 5', 'file':'[1080p]//de2.anilibria.tv/videos/ts/8374/0005-hd/playlist.m3u8,[720p]//de2.anilibria.tv/videos/ts/8374/0005/playlist.m3u8,[480p]//de2.anilibria.tv/videos/ts/8374/0005-sd/playlist.m3u8', Hitoribocchi no Marumaru Seikatsu-5-sd.mp4",
=Hitoribocchi no Marumaru Seikatsu-5-sd.mp4", 'id': 's5'}
Необходимо найти все строки которые начинаются с "download:"https:" и заканчиваются на ".mp4"," и удалить их.
Например чтобы были удалены только строки такого вида:
Код: Выделить весь код
download:"https://x.anilibria.tv/get/z0k5b2jejzcDn4Ul35wXTg/1557778143/mp4/8330/0006.mp4?download=Midara na Ao-chan wa Benkyou ga Dekinai-6-sd.mp4",
Количество строк каждый раз разные....

-------
Век живи, век учись! =)


Отправлено: 05:52, 12-05-2019

 

Ветеран


Сообщения: 2970
Благодарности: 621

Профиль | Отправить PM | Цитировать


итак, выходные - прекрасное время для флейма, офтопиков и некропостинга :-)

Признаю: когда я писал про лёгкость операции сравнения, то заблуждался.
В первую очередь я подразумевал оператор '===' из javascript. Но в vbs нет ничего подобного, да и строки там - не ссылочный тип. Впрочем, такой подход не сработает и в javascript - метод replace там всегда возвращает новую строку. В powershell объекты сравниваются по хэшу, но во-первых это не касается строк, во вторых он вычисляется не при создании объекта, а при вызове, поэтому всё равно отдельно перелопачивать весь массив данных.

Что касается приведённых измерений, то Compare-Object, к сожалению, вообще здесь неприменим, как и оператор -eq - они выполняют регистронезависимое сравнение строк. Что к тому же очевидно дольше.

тест скорости сравнения больших строк на PoSh разными методами

Код: Выделить весь код
Describe 'Скорость сравнения длинных строк' {

    $times = 100000

    $lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`n"

    $originalString = $lorem * $times + '1'
    $similarString = $lorem * $times + '1'
    $modifiedString = $lorem * $times + '2'

    Context 'сравнение оператором -eq' {

        It 'разных строк' {
            $originalString -eq $modifiedString | Should -BeFalse
        }

        It 'одинаковых строк' {
            $originalString -eq $similarString | Should -BeTrue
        }

        It 'самой себя' {
            $originalString -eq $originalString | Should -BeTrue
        }
    }

    Context 'сравнение оператором -ceq' {

        It 'разных строк' {
            $originalString -ceq $modifiedString | Should -BeFalse
        }

        It 'одинаковых строк' {
            $originalString -ceq $similarString | Should -BeTrue
        }

        It 'самой себя' {
            $originalString -ceq $originalString | Should -BeTrue
        }
    }

    Context 'сравнение методом Compare' {

        It 'разных строк' {
            $originalString.CompareTo($modifiedString) | Should -Be -1
        }

        It 'одинаковых строк' {
            $originalString.CompareTo($similarString) | Should -Be 0
        }

        It 'самой себя' {
            $originalString.CompareTo($originalString) | Should -Be 0
        }
    }

    Context 'сравнение методом Equals' {

        It 'разных строк' -ErrorAction SilentlyContinue {
            $originalString.Equals($modifiedString) | Should -BeFalse
        }

        It 'одинаковых строк' {
            $originalString.Equals($similarString) | Should -BeTrue
        }

        It 'самой себя' {
            $originalString.Equals($originalString) | Should -BeTrue
        }
    }

    Context 'сравнение командлетом Compare-Object' {

        It 'разных строк' {
            Compare-Object $originalString $modifiedString | Should -Not -BeNullOrEmpty
        }

        It 'одинаковых строк' {
            Compare-Object $originalString $similarString | Should -BeNullOrEmpty
        }

        It 'самой себя' {
            Compare-Object $originalString $originalString | Should -BeNullOrEmpty
        }
    }

    Context 'сравнение командлетом Compare-Object -IncludeEqual' {

        It 'разных строк' {
            Compare-Object $originalString $modifiedString -IncludeEqual | Should -Not -BeNullOrEmpty
        }

        It 'одинаковых строк' {
            Compare-Object $originalString $similarString -IncludeEqual | Should -Not -BeNullOrEmpty
        }

        It 'самой себя' {
            Compare-Object $originalString $originalString -IncludeEqual | Should -Not -BeNullOrEmpty
        }
    }

    Context 'сравнение хэшей' {

        It 'разных строк' {
            $originalString.GetHashCode() -eq $modifiedString.GetHashCode() | Should -BeFalse
        }

        It 'одинаковых строк' {
            $originalString.GetHashCode() -eq $similarString.GetHashCode() | Should -BeTrue
        }

        It 'самой себя' {
            $originalString.GetHashCode() -eq $originalString.GetHashCode() | Should -BeTrue
        }
    }

}

результаты теста
Код: Выделить весь код
Describing Скорость сравнения длинных строк

  Context сравнение оператором -eq
    [+] разных строк 944ms
    [+] одинаковых строк 84ms
    [+] самой себя 84ms

  Context сравнение оператором -ceq
    [+] разных строк 127ms
    [+] одинаковых строк 87ms
    [+] самой себя 84ms

  Context сравнение методом Compare
    [+] разных строк 725ms
    [+] одинаковых строк 688ms
    [+] самой себя 701ms

  Context сравнение методом Equals
    [+] разных строк 94ms
    [+] одинаковых строк 36ms
    [+] самой себя 9ms

  Context сравнение командлетом Compare-Object
    [+] разных строк 959ms
    [+] одинаковых строк 686ms
    [+] самой себя 677ms

  Context сравнение командлетом Compare-Object -IncludeEqual
    [+] разных строк 717ms
    [+] одинаковых строк 922ms
    [+] самой себя 811ms

  Context сравнение хэшей
    [+] разных строк 110ms
    [+] одинаковых строк 80ms
    [+] самой себя 80ms


Так что доступные скриптовые языки ни прямо, ни косвенно не говорят: была произведена замена или нет (не относится к современному JavaScript - там пишется LastIndex в объект RegExp). Костыльное решение этого вопроса - в качестве аргумента замены использовать не строку, а функцию:
Код: Выделить весь код
n=0; 'abcba'.replace(/b/g, function() {n++; return ('B')});
в PoSh это завезли только в версии 6.1:
Код: Выделить весь код
$n=@{value = 0}; 'abcba' -replace 'b', { $n.value++; 'B' }
либо в более ранних PoSh использовать .NET класс:
Код: Выделить весь код
$n=@{value = 0}; [Regex]::Replace('abcba', 'b', { $n.value++ ; 'B' });
(в нашем конкретном случае счётчик не нужен, достаточно булевого флага: была_замена/не_было)

Цитата YuS_2:
В общем, если есть какие-либо дополнения по поводу эффективности, хотелось бы увидеть пояснения на примерах, от автора слов:
Цитата Busla:
не надеяться на достаточный объём памяти, а работать построчно
тогда и вопрос перезаписи снимется »
я о том, что если в память не лезет, то нам надо писать во временный файл, и результат у нас уже присутсвует на диске. Поэтому оригинальный файл переименовывается в .bak, а временный получает имя основного. И так оно как бы правильнее. Вопрос в итоге чисто декоративный, в плане ресурсов бесплатный.
Эффективность считывания в память будет заметна только для определённого диапазона размеров: для мелких незаметно, в случае крупных - ОС всё равно задействует файл подкачки для освобождения оперативки, и мы возвращаемся к медленным дисковым операциям.
И да, я осознаю, что блочные дисковые операции будут значительно быстрее, но такая оптимизация на мой взгляд нужна скорее для завершённых утилит, а не для скиптов, которые должно быть легко понять и поправить.

Отправлено: 15:38, 26-05-2019 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Старожил


Сообщения: 379
Благодарности: 146

Профиль | Отправить PM | Цитировать


Пара уточнений:
Цитата Busla:
Что касается приведённых измерений, то Compare-Object, к сожалению, вообще здесь неприменим, как и оператор -eq - они выполняют регистронезависимое сравнение строк. »
Почему к сожалению? Это ведь не константа, у diff же есть ключик регистрозависимого сравнения, а оператор -ceq делает это вместо -eq сам...

Цитата Busla:
Так что доступные скриптовые языки ни прямо, ни косвенно не говорят: была произведена замена или нет »
косвенно, в powershell, как раз, можно отматчить регэкспом то, что требуется посчитать:
Код: Выделить весь код
$a = sls -inp 'abcbadabvbnb' -patt '.b' -all;$a.matches
Но нам-то было интересно, в данном случае, не количество, а скорость...

-------
scio me nihil scire


Отправлено: 22:00, 26-05-2019 | #32


Ветеран


Сообщения: 2970
Благодарности: 621

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
у diff же есть ключик регистрозависимого сравнения »
но ни вы, ни Iska его, к сожалению, не использовали - речь об этом

Цитата YuS_2:
косвенно, в powershell, как раз, можно отматчить регэкспом то, что требуется посчитать »
это не косвенно, а отдельная самостоятельная работа/задача, со своим самостоятельным результатом

Цитата YuS_2:
Но нам-то было интересно, в данном случае, не количество, а скорость... »
нет
для скорости надо было заниматься оптимизацией операций чтения/записи

Отправлено: 00:20, 27-05-2019 | #33


Аватара для YuS_2

Старожил


Сообщения: 379
Благодарности: 146

Профиль | Отправить PM | Цитировать


Цитата Busla:
но ни вы, ни Iska его, к сожалению, не использовали - речь об этом »
то, что не использовали, это не говорит ведь о том, что это невозможно... а то, что регистрозависимый поиск быстрее, подразумевается по умолчанию.

Цитата Busla:
отдельная самостоятельная работа/задача, со своим самостоятельным результатом »
пусть так, но дабы возникнет необходимость получить количественные данные, по крайней мере, такая возможность существует и к тому же, кроме количества, мы ещё и получаем индексы вхождений, в отличие от:
Цитата Busla:
Костыльное решение этого вопроса »
======
Цитата Busla:
нет »
Что значит нет?!
Повторюсь, мы не гнались за количеством, а практически стройным хором пели:
"Не думай о секундах свысока!"


Цитата Busla:
для скорости надо было заниматься оптимизацией операций чтения/записи »
Так вот это-то и хотелось увидеть... для данного, конкретного случая...

-------
scio me nihil scire


Отправлено: 07:57, 27-05-2019 | #34


Ветеран


Сообщения: 2970
Благодарности: 621

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Цитата Busla:
для скорости надо было заниматься оптимизацией операций чтения/записи »
Так вот это-то и хотелось увидеть... для данного, конкретного случая... »
юмор в том, что "для данного, конкретного случая" это не нужно

этот скрипт получает данные от одной программы и преобразует их для другой
задача/проблема дискового ввода-вывода тут возникает только у людей с пониженной компьютерной грамотностью

Отправлено: 12:16, 27-05-2019 | #35


Аватара для YuS_2

Старожил


Сообщения: 379
Благодарности: 146

Профиль | Отправить PM | Цитировать


Цитата Busla:
этот скрипт получает данные от одной программы и преобразует их для другой »
Нет, я о том, что:
Цитата Iska:
На PowerShell:
Код: »
и потом:
Цитата Busla:
а если гигабайт? »
Цитата Busla:
не надеяться на достаточный объём памяти, а работать построчно
тогда и вопрос перезаписи снимется »
Т.е. в данном, конкретном случае, как избежать перезаписи файла, если нет фактических изменений данных?

-------
scio me nihil scire


Отправлено: 13:21, 27-05-2019 | #36


Ветеран


Сообщения: 2970
Благодарности: 621

Профиль | Отправить PM | Цитировать


YuS_2, если буквально, то при построчной обработке вы не можете ПЕРЕзаписывать файл, избегать нечего
если подробно - конец 31го комментария
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:55, 27-05-2019 | #37


Аватара для YuS_2

Старожил


Сообщения: 379
Благодарности: 146

Профиль | Отправить PM | Цитировать


Цитата Busla:
то при построчной обработке вы не можете ПЕРЕзаписывать файл, избегать нечего»
А, в этом смысле... тогда понятно. Спасибо.

-------
scio me nihil scire


Отправлено: 17:45, 27-05-2019 | #38



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Необходимо найти все строки которые начинаются с "download:"https:" и заканчиваются

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Как из строки в .txt вывести символы "которые там обновляются"в другой .txt Bombastig Скриптовые языки администрирования Windows 6 08-02-2014 04:54
Интерфейс - [решено] Нет "стеклянного" эффекта при наведении на "Свернуть все окна" aka_smile Microsoft Windows 7 5 21-09-2012 11:49
Не получается найти все выпуски "Хакер"+"спец"+"железо" verdix Хочу все знать 5 29-11-2008 15:19
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") submaster Microsoft Windows NT/2000/2003 5 13-09-2006 12:29




 
Переход