Показать полную графическую версию : [решено] Необходимо найти все строки которые начинаются с "download:"https:" и заканчиваются
angel_lyucifer
12-05-2019, 05:52
Здравствуйте, нужна ваша помощь.
Есть текстовый файл сгенерированный программой, вид содержимого файла:
{'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",
Количество строк каждый раз разные....
megaloman
12-05-2019, 15:16
FileIn = "Z:\Box_In\Исходный файл.txt"
S1 = "download:""https:"
S2 = ".mp4"","
With WScript.Arguments
If .Count <> 0 Then FileIn = .Item(0)
End With
With CreateObject("Scripting.FileSystemObject")
On Error Resume Next
With .OpenTextFile(FileIn, 1)
If Err.Number <> 0 Then
MsgBox "Error open file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
InTxt = .ReadAll
If Err.Number <> 0 Then
MsgBox "Error read file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
.Close
On Error GoTo 0
End With
Mas = Split(InTxt, vbCrLf)
With .CreateTextFile(FileIn, True)
For Each iMas In Mas
If Not (InStr(1, iMas, S1) = 1 And (InStrRev(iMas, S2) + Len(S2) - 1) = Len(iMas)) Then
.WriteLine iMas
End If
Next
.Close
End With
End With
findstr /V /R "^download:\"https.*mp4\",$" text.txt
angel_lyucifer
13-05-2019, 00:48
Имя файла можно прописывать явным образом в скрипте, либо указывать в аргументе скрипта в кавычках при вызове, либо создать, например, на рабочем столе значок на этот скрипт и в проводнике затягивать на него мышкой обрабатываемый файл »
Скрипт запускается, но ничего не происходит.
А расширение вашего скрипта vbs?
FileIn = "Z:\Box_In\Исходный файл.txt"
S1 = "download:""https:"
S2 = ".mp4"","
With WScript.Arguments
If .Count <> 0 Then FileIn = .Item(0)
End With
With CreateObject("Scripting.FileSystemObject")
On Error Resume Next
With .OpenTextFile(FileIn, 1)
If Err.Number <> 0 Then
MsgBox "Error open file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
InTxt = .ReadAll
If Err.Number <> 0 Then
MsgBox "Error read file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
.Close
On Error GoTo 0
End With
Mas = Split(InTxt, vbCrLf)
With .CreateTextFile(FileIn, True)
For Each iMas In Mas
If Not (InStr(1, iMas, S1) = 1 And (InStrRev(iMas, S2) + Len(S2) - 1) = Len(iMas)) Then
.WriteLine iMas
End If
Next
.Close
End With
End With
megaloman
13-05-2019, 01:25
angel_lyucifer, расширение vbs, заархивируйте и дайте образец Вашего файла, так можно сто лет гадать, в чем дело.
angel_lyucifer
13-05-2019, 06:12
заархивируйте и дайте образец Вашего файла, так можно сто лет гадать, в чем дело. »
Ок, вот.
Ок, вот. »
в этом файле всего одна строка, поэтому никаких строк:
найти все строки которые начинаются с "download:"https:" и заканчиваются на ".mp4"," »
найдено не будет, т.к. они попросту не существуют в таком виде.
angel_lyucifer
14-05-2019, 00:24
найдено не будет, т.к. они попросту не существуют в таком виде. »
Я вас понял, но всё же необходимо удалить все эти фрагменты в строке...
необходимо удалить все эти фрагменты в строке... »
Так это совсем другое дело, нежели озвученное ранее:
Необходимо найти все строки которые начинаются с "download:"https:" и заканчиваются на ".mp4"," и удалить их. »
На PowerShell:
(Get-Content -Path 'C:\Мои проекты\0261\playlist.txt') -replace "download:`"https://.*?\.mp4`", " | Set-Content -Path 'C:\Мои проекты\0261\playlist2.txt'
angel_lyucifer
14-05-2019, 05:34
На PowerShell: »
А можно ли на языке vbs?
megaloman
14-05-2019, 07:28
FileIn = "Z:\Box_In\playlist.txt"
RegExp = "download:""https:.*?\.mp4"", "
With WScript.Arguments
If .Count <> 0 Then FileIn = .Item(0)
End With
With CreateObject("Scripting.FileSystemObject")
On Error Resume Next
With .OpenTextFile(FileIn, 1)
If Err.Number <> 0 Then
MsgBox "Error open file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
InTxt = .ReadAll
If Err.Number <> 0 Then
MsgBox "Error read file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
.Close
On Error GoTo 0
End With
With CreateObject("VBScript.RegExp")
.Pattern = RegExp
.IgnoreCase = True
.MultiLine = True
.Global = True
Result = .Replace(InTxt, "")
End With
With .CreateTextFile(FileIn, True)
.Write Result
.Close
End With
End With
MsgBox "Done!"
А можно ли на языке vbs? »
пора переходить уже... ибо:
Век живи, век учись! =) »
:wink:
angel_lyucifer
14-05-2019, 11:49
А можно на языке vbs удалить все эти фрагменты »
Спасибо вам большое....
megaloman, несколько замечаний по коду:
.MultiLine в данном случае не нужен;
.Replace() следует выполнять только после проверки совпадения шаблона по .Test();
то же самое касается и пересоздания файла, дабы не переписывать одно и то же, т.е. и Replace(), и .CreateTextFile() должны быть внутри условия If .Test(…) Then … End If (на PowerShell, кстати, мне тоже следовало бы так делать).
.Replace() следует выполнять только после проверки совпадения шаблона по .Test() »
нет
на PowerShell, кстати, мне тоже следовало бы так делать »
на PowerShell не надо пытаться писать как на (Visual)Basic
megaloman
14-05-2019, 22:20
.Replace() следует выполнять только после проверки совпадения шаблона по .Test(); »
ИМХО, не так категорично. Однако, если помнить о том, что это касается и пересоздания файла, дабы не переписывать одно и то же, »
.................
With CreateObject("VBScript.RegExp")
.Pattern = RegExp
.IgnoreCase = True
.Global = True
If Not .Test(InTxt) Then
MsgBox "no substrings to replace. Reg expression:" + vbCrLf + vbCrLf + """" + RegExp + """"
WScript.Quit 1
End If
Result = .Replace(InTxt, "")
End With
.................
нет »
Да.
на PowerShell не надо пытаться писать как на (Visual)Basic »
Как токмо PowerShell превратится из процедурного языка в какой-нибудь функциональный — так сразу и начну не пытаться писать.
ИМХО, не так категорично. »
Если для последующей обработки критичны дата/время файла, или же сам файл имеет объём, исчисляемый в сотнях мегабайт — то категорично. Лучше зараз привыкать.
или же сам файл имеет объём, исчисляемый в сотнях мегабайт — то категорично. »
а если гигабайт?
Лучше зараз привыкать »
не надеяться на достаточный объём памяти, а работать построчно
тогда и вопрос перезаписи снимется
Как токмо »
не кривяйтесь
PowerShell превратится из процедурного языка в какой-нибудь функциональный »
аргументируйте: каким местом PowerShell нефункциональный? и почему он процедурный?
а если гигабайт? »
То ещё категоричнее ;).
не надеяться на достаточный объём памяти, а работать построчно»
Это правильный подход.
тогда и вопрос перезаписи снимется »
Вопрос останется. Зачем переписывать много…байтный файл, в котором ничего не изменилось?
не кривяйтесь »
Видимо, «кривляйтесь». Приношу Вам свои извинения, считайте неудавшейся шуткой.
аргументируйте: каким местом PowerShell нефункциональный? и почему он процедурный? »
Хорошо, выражусь иначе: я не вижу существенных отличий в парадигме программирования между WSH и PowerShell (за исключением конвеера). А уж что будет использоваться, If .Test(…) Then … End If или If([RegEx]::IsMatch(…)) {…} — не суть важное.
не вижу существенных отличий в парадигме программирования между WSH и PowerShell (за исключением конвеера) »
я бы сказал, что powershell мультипарадигмальный язык, так как в нем явно присутствуют, как минимум, три - функциональная, процедурная и ООП
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.