|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Удаление дубликатов строк из текстового файла со сравнением по две строки |
|
Любой язык - [решено] Удаление дубликатов строк из текстового файла со сравнением по две строки
|
Старожил Сообщения: 232 |
Доброго времени суток всем.
Знаю что тема уже изъезжена, но готового решения найти не получается. Есть плейлисты (по сути текстовые файлы), при их создании может получаться большое количество дублирующих строк. Например: #EXTINF:0, 1+1 http://193.106.211.2:1234/udp/225.1.1.103:4001 #EXTINF:0, ICTV http://193.106.211.2:1234/udp/225.1.1.104:4001 #EXTINF:0, 5 канал http://193.106.211.2:1234/udp/225.1.1.105:4001 #EXTINF:0, СТБ http://193.106.211.2:1234/udp/225.1.1.106:4001 #EXTINF:0, ТРК «Украина» http://193.106.211.2:1234/udp/225.1.1.107:4001 #EXTINF:0, Сити http://193.106.211.2:1234/udp/225.1.1.108:4001 #EXTINF:0, Тонис http://193.106.211.2:1234/udp/225.1.1.111:4001 #EXTINF:0, ТЕТ http://193.106.211.2:1234/udp/225.1.1.110:4001 #EXTINF:0, ТРК «Киев» http://193.106.211.2:1234/udp/225.1.1.114:4001 #EXTINF:0, Тонис http://193.106.211.2:1234/udp/225.1.1.111:4001 #EXTINF:0, Мега http://193.106.211.2:1234/udp/225.1.1.112:4001 #EXTINF:0, М1 http://193.106.211.2:1234/udp/225.1.1.113:4001 #EXTINF:0, канал «Киев» http://193.106.211.2:1234/udp/225.1.1.114:4001 #EXTINF:0, 2+2 http://193.106.211.2:1234/udp/225.1.1.115:4001 #EXTINF:0, ТРК «Украина» http://190.106.210.2:1234/udp/225.1.1.107:4001 Пересмотрел кучу различных скриптов, сам пробовал батники писать, но все они считывают по одной строке и в выходном файле может получится к названию канала несколько адресов или наоборот. К примеру такой батник: @echo off setlocal disableDelayedExpansion set "file=%~1" set "line=%file%.line" set "deduped=%file%.deduped" ::Define a variable containing a linefeed character set LF=^ ::The 2 blank lines above are critical, do not remove >"%deduped%" ( for /f usebackq^ eol^=^%LF%%LF%^ delims^= %%A in ("%file%") do ( set "ln=%%A" setlocal enableDelayedExpansion >"%line%" (echo !ln:\=\\!) >nul findstr /xlg:"%line%" "%deduped%" || (echo !ln!) endlocal ) ) >nul move /y "%deduped%" "%file%" 2>nul del "%line%" #EXTINF:-1 group-title="Познавательные",Brodilo.TV http://brodilo.tv/channel.php #EXTINF:-1 group-title="Познавательные",Da Vinci Learning http://hls.peers.tv/streaming/da_vinci/16/tvrecw/playlist.m3u8|User-Agent=DuneHD/1.0.3 http://194.28.155.10:81/udp/225.0.55.26:1234 #EXTINF:-1 group-title="Прочие каналы:",112 Украина #EXTINF:-1 group-title="Прочие каналы:",112 Украина HD http://112hd-hls3.cosmonova.net.ua/hls/112hd_ua_mid/index.m3u8 http://app.live.112.events/hls-ua/112hd_mid/index.m3u8 #EXTINF:-1 group-title="Прочие каналы:",112 Украина [FHD] #EXTINF:-1 group-title="Прочие каналы:",112 Україна #EXTINF:-1 group-title="Прочие каналы:",112 Україна HD #EXTINF:-1 group-title="Прочие каналы:",12 Канал (Омск) http://12channel.bonus-tv.ru:80/stream549837052987/tracks-v1a1/mono.m3u8 #EXTINF:-1 group-title="Познавательные",Discovery Channel http://st6.allplay.uz/iptv/4/index.m3u8 #EXTINF:-1 group-title="Познавательные",Discovery Channel HD http://st6.allplay.uz/iptv/74/index.m3u8 Другие скрипты делают аналогично. Они сравнивают по одной строке. Может кто подскажет как реализовать сравнивание строк попарно, чтобы не нарушалась структура плейлиста ? Премного буду благодарен за помощь. |
|
Отправлено: 23:26, 26-06-2019 |
Crazy Сообщения: 1231
|
Профиль | Отправить PM | Цитировать Цитата Alex2010god:
![]() Где это видно? Покажите полностью, что Вы запускаете, какая при этом возникает ошибка и главное - что в итоге желаете получить. А применительно к указанному выше скрипту: function set-outfile { process{ $file = 'out_'+$_.name @(for($i, $arr = 0, (gc $_.fullname -Encoding utf8); $i -lt $arr.Length;) { $a, $b = $arr[$i], $arr[$i + 1] # потенциальная пара # критерий относительно которого формируется пара if ($a.StartsWith('#EXTINF') -and $b -match ':\/\/') { # выводим пару в окно хоста "$a`n$b" # переходим на две позиции вперед $i += 2 } else { # в противном случае переходим к следующему значению ++$i continue } }) | Sort-Object -Unique | Out-File $file -Encoding utf8 } } $fld = 'D:\1\FILMOTEKA.M.C+\*' dir $fld -inc *.m3u -file|set-outfile |
|
------- Отправлено: 20:51, 05-08-2020 | #31 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Так все же видно на скриншотах(опубликованных ранее в теме,ничего не менял кроме версии ПоверШелл).
|
Отправлено: 20:08, 07-08-2020 | #32 |
Crazy Сообщения: 1231
|
Профиль | Отправить PM | Цитировать Цитата Alex2010god:
2. Скрипт лучше показывать в текстовом виде, а не скриншотами... 3. Цитата Alex2010god:
4. Цитата YuS_2:
![]() |
|||
------- Отправлено: 20:36, 07-08-2020 | #33 |
Ветеран Сообщения: 1758
|
|
Отправлено: 20:47, 07-08-2020 | #34 |
Crazy Сообщения: 1231
|
Профиль | Отправить PM | Цитировать Цитата Foreigner:
|
|
------- Отправлено: 21:31, 07-08-2020 | #35 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Для меня темный лес,ну попытался и не получилось(зря только версию на русском языке "ПоверШелл" сменил на английскую).
Цель была такова - обработать плейлист IPTV и выявить и удалить дубликаты. Проще было бы батник скрипта сделать(положил в папку с плейлистом,нажал он сам все сделал и выдал готовый плейлист с тем же именем+цифра 01,последующий обработанный плейлист 02 и Т.Д.) На просторах "паутины" нашел программу - без оболочки которая все это делает в один клик(искал неделю или две). |
Отправлено: 00:53, 08-08-2020 | #36 |
Crazy Сообщения: 1231
|
Профиль | Отправить PM | Цитировать Цитата Alex2010god:
Здесь существует несколько если: Если плейлист составлен верно и в нем нет ошибок, описанных выше, Если в плейлисте отсутствуют "лишние" строки, как-то, например маркер плейлиста (#EXTM3U) и т.п., Если цель - исключительно только удалить дублирующиеся ПАРЫ строк, то для одного файла, достаточно запустить такой скрипт: http://forum.oszone.net/post-2877089.html#post2877089 # Здесь в одинарных кавычках необходимо указать свои: путь к файлу и наименование файла $file = gi 'd:\исходный каталог\исходный файл.m3u' # Формируем имя выходного файла: $out = $file.directoryname + $file.basename + '_out' + $file.extension # Удаляем дубликаты пар строк с одновременной сортировкой: gc $file -r 2|sort -uni|out-file $out -enc utf8 function delete-marker { process{ $file = $_.fullname if (($a = gc $_.fullname -enc utf8)[0] -match '^#EXTM3U'){ $a[1..$a.length]|out-file $file -enc utf8 } } } function set-outfile { process{ $out = $_.directoryname + '\' + $_.basename + '_out' + $_.extension # Удаляем дубликаты пар строк с одновременной сортировкой gc $_.fullname -r 2 -enc utf8|sort -uni|out-file $out -enc utf8 } } # Путь к каталогу с исходными файлами (астериск * - указывать обязательно): $fld = 'D:\1\FILMOTEKA.M.C+\*' # Сначала удаляем маркеры плейлиста из файлов: $arr = dir $fld -inc '*.m3u','*.m3u8' -file|delete-marker # Далее, вызов функции обработки файлов: $arr|set-outfile В общем, это уже другая задача, под которую необходимо составить перечень условий, т.е. вычленить все возможные "лишние" теги, которые надо либо удалить, либо просто добавить в строку, например (#EXTINF:-1 group-title="Общие",Евроновости), которая изначально может быть представлена так: Цитата:
![]() Цитата Alex2010god:
![]() |
|||
------- Последний раз редактировалось YuS_2, 08-08-2020 в 12:14. Отправлено: 12:02, 08-08-2020 | #37 |
Crazy Сообщения: 1231
|
Профиль | Отправить PM | Цитировать Цитата Fors1k:
![]() А если проверить ещё и названия каналов на соответствие того, что в ссылках... там вообще мрак... Цитата Fors1k:
Минимально встречавшиеся кривости (далеко не все возможные, наверное)
#EXTM3U #EXTINF:-1 ,0 - FREE-IPTV /$USB_DIR/sda1/free_ip.m3u #EXTINF:-1 ,Первый канал #EXTGRP:Российские http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Россия 1 http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Матч ТВ http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,НТВ http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Пятый канал http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8 Здесь какая-то информация http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Пятый канал #EXTINF:-1 ,Россия К #EXTGRP:Российские http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Москва 24 http://91.231.219.145:80/tv_moscow_24/video.m3u8 #EXTINF:-1 ,Санкт-Петербург http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8 https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png #EXTINF:-1 ,Discovery http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8 #EXTINF:-1 ,NASA TV http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8 #EXTINF:-1 ,Россия 24 http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Карусель http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Первый канал #EXTGRP:Российские http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Россия 1 http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Матч ТВ http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,НТВ http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Пятый канал http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8 Здесь какая-то информация http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Пятый канал #EXTINF:-1 ,Россия К #EXTGRP:Российские http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Москва 24 http://91.231.219.145:80/tv_moscow_24/video.m3u8 #EXTINF:-1 ,Санкт-Петербург http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8 https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png #EXTINF:-1 ,Discovery http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8 #EXTINF:-1 ,NASA TV http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8 #EXTINF:-1 ,Россия 24 http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Карусель http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8 Должно получится примерно это: более-менее выправленный лист
#EXTINF:-1 ,0 - FREE-IPTV /$USB_DIR/sda1/free_ip.m3u #EXTINF:-1 ,Discovery http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8 #EXTINF:-1 ,NASA TV http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8 #EXTINF:-1 ,Карусель http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Матч ТВ http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Москва 24 http://91.231.219.145:80/tv_moscow_24/video.m3u8 #EXTINF:-1 ,НТВ http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Пятый канал http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Россия 1 http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Россия 24 http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 ,Санкт-Петербург http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8 #EXTINF:-1 group-title="Российские",Первый канал http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8 #EXTINF:-1 group-title="Российские",Россия К http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8 Примерный код, возможно неоптимальный. Медленный, но верно работающий... :)
param ( # Создаем три каталога для работы (в каждом будут находится плейлисты) # Путь к каталогу с исходными файлами: [string]$infolder = 'D:\in', # Путь к каталогу с промежуточными файлами, т.е. исправленные плейлисты с возможными дубликатами: [string]$workfolder = 'D:\work', # Путь к каталогу с целевыми файлами без дубликатов: [string]$outfolder = 'D:\out', # Фильтр для отбора файлов: [string[]]$filter = ('*.m3u','*.m3u8') ) function set-groupchannel { # Выправляем кривые плейлисты. Всё лишнее будет удалено, только группы #EXTGRP добавляются в строку #EXTINF process{ $arr = new-object system.collections.generic.list[system.string] $fout = $fldwrk.fullname + '\' + $_.name gc $_.fullname -enc utf8|%{ if($_ -match '^#extgrp'){ $rep = $_ -replace '#extgrp:' if ($arr.length -gt 0){ if ($arr[-1] -match '^#extinf' -and $arr[-1] -notmatch 'group-title'){ $arr[-1] = $arr[-1] -replace '(?<=#extinf:\s*-?\d+)([^,]*),'," group-title=`"$rep`"$1," } } } elseif ($_ -match '^#extinf') { if ($arr.length -gt 0){ if($arr[-1] -match '^#extinf'){ $arr[-1] = $_ } else {$arr.add($_)} } else {$arr.add($_)} } elseif ($_ -notmatch '^#'){ if($arr.length -gt 0){ if($arr[-1] -match '^#extinf'){ $arr.add($_) } } } } $arr|out-file $fout -enc utf8 } } function set-outfile { # Удаляем дубликаты пар строк с одновременной сортировкой этих пар process{ $out = $fldout.fullname + '\' + $_.name gc $_.fullname -r 2 -enc utf8|sort -uni|out-file $out -enc utf8 } } if (!(test-path $workfolder)){md $workfolder} if (!(test-path $outfolder)){md $outfolder} $fldin = gi $infolder $fldwrk = gi $workfolder $fldout = gi $outfolder # Исправляем плейлисты: dir ($fldin.fullname + '\*') -inc $filter -file|set-groupchannel # Удаляем дубликаты и сортируем: dir ($fldwrk.fullname + '\*') -inc $filter -file|set-outfile |
||
------- Последний раз редактировалось YuS_2, 09-08-2020 в 09:42. Причина: добавлен код для работы с плейлистами... Отправлено: 07:31, 09-08-2020 | #39 |
Старожил Сообщения: 193
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
У всех интернет-провайдеров же цифровое тв практически бесплатно, так что не довелось столкнуться с iptv. Цитата YuS_2:
param( $pathIN = "C:\files\list.txt", $pathOUT = "C:\files\list_new.txt" )cls $List=((Get-Content $pathIN -raw) -replace "(`r`n#EXTGRP:)((?<=#EXTGRP:)[^`r]+)" , ' ($2)'| sls "#E[^#]+?(\.m3u.?|:\d{4})(?=`r|$)"-A).Matches.Value|sort {($_-split"`r`n")[1]} -u $List|out-file $pathOUT В общем интересно было поискать уникальные пары, а в самих плейлистах не шарю) |
||
Последний раз редактировалось Fors1k, 11-08-2020 в 03:02. Отправлено: 22:54, 10-08-2020 | #40 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Любой язык - Удаление из txt файлов не нужных строк и дубликатов строк. | voler | Скриптовые языки администрирования Windows | 1 | 26-02-2018 14:10 | |
Delphi - Обработчик строк из текстового файла | pageYK@fb | Программирование и базы данных | 18 | 11-08-2016 13:40 | |
CMD/BAT - [решено] Удаление строки из текстового файла | Elven | Скриптовые языки администрирования Windows | 2 | 29-11-2013 17:44 | |
CMD/BAT - Поиск и копирование нескольких строк из текстового файла. | valen | Скриптовые языки администрирования Windows | 0 | 07-11-2011 17:27 | |
CMD/BAT - [решено] Перенос и удаление строк из текстового файла | sk8ter | Скриптовые языки администрирования Windows | 15 | 03-10-2010 19:35 |
|