Войти

Показать полную графическую версию : Разбить строку, содержащую кавычки, на несколько.


ioSIS
26-05-2022, 20:55
Здравствуйте, форумчане!
Прошу помощи в разработке скрипта.

Имеется строка вида:

1|Russian|Dub, Blu-ray CEE}}}2|Ukrainian|DVO}}}3|Russian|MVO, "DVD Magic"}}}4|Russian|VO, Gotlib}}}5|English}}}

Нужно разбить ее на строки по разделителю "}}}", чтобы получилось:

1|Russian|Dub, Blu-ray CEE
2|Ukrainian|DVO
3|Russian|MVO, "DVD Magic"
4|Russian | VO, Gotlib
5|English

В основной строке могут быть любые символы, включая кавычки.

DJ Mogarych
26-05-2022, 21:01
Powershell:

# Предполагается, что строка находится в файле
(gc "C:\temp\string.txt") -replace '}}}','}' -split '}'

ioSIS
26-05-2022, 21:43
Спасибо за это вариант.
А на CMD можно это сделать?
А то я в Powershell не шарю.

PS: Строка получена как вывод другой программы.

Fors1k
26-05-2022, 22:05
А то я в Powershell не шарю. »
А чего тут шарить? Код же дали готовый, вам только запустить.
Строка получена как вывод другой программы. »
Напишите команду запуска той программы, тогда можно будет все в один скрипт объединить.

DJ Mogarych, только там получится один лишний вывод из-за скобок в конце, надо бы обрезать.
$str = '1|Russian|Dub, Blu-ray CEE}}}2|Ukrainian|DVO}}}3|Russian|MVO, "DVD Magic"}}}4|Russian|VO, Gotlib}}}5|English}}}'

$res = $str.Trim('}}}') -split '}}}'
$res

DJ Mogarych
26-05-2022, 22:41
А я и забыл, что -split может несколько символов в качестве разделителя использовать.
cut в bash таких вольностей не позволяет, например.

Fors1k
26-05-2022, 23:44
DJ Mogarych, ага. Да хоть регулярку)

ioSIS
27-05-2022, 09:58
Напишите команду запуска той программы, тогда можно будет все в один скрипт объединить. »

MediaInfo.exe --Output=Audio;%StreamKindPos%^|%Language/String%^|%Title%}}} D:\1\Test_quotes.mkv


В выводе команды могут быть как двойные, так и одинарные кавычки.

Fors1k
27-05-2022, 13:20
$mediaInfo = "D:\MediaInfo.exe"
$videoPath = "D:\Фмльмы\TheGame.HDR.mkv"

$audioInfo = .$mediaInfo "--Output=Audio;%StreamKindPos%|%Language/String%|%Title%}}}" $videoPath
[Text.Encoding]::UTF8.GetString([Console]::OutputEncoding.GetBytes($audioInfo)).Trim("}}}")-Split("}}}")
Вывод:
1|Russian|Dub, Пифагор/Кинопоиск HD
2|Russian|MVO, HDRezka Studio
3|Russian|DVO, Pazl Voice
4|English|

DJ Mogarych
27-05-2022, 13:58
%Title%}}} »
Может, убрать эти фигурные скобки в конце, и их не нужно будет отрезать потом?

ioSIS
27-05-2022, 16:05
%Title%}}} »
Может, убрать эти фигурные скобки в конце, и их не нужно будет отрезать потом?
Так они разделяют данные каждой дорожки. Без них простот склеится в одну строку, и как разделять потом?

DJ Mogarych
27-05-2022, 17:40
Например, так:

1|Russian|Dub, Blu-ray CEE2|Ukrainian|DVO3|Russian|MVO, "DVD Magic"4|Russian|VO, Gotlib5|English

-split '(?=\d+\|)'



Более того, можно посмотреть и возможности самого экспорта MediaInfo по переносу строк, например, попробовать так:

--Output=Audio;%StreamKindPos%|%Language/String%|%Title%\n

Upd: да, так работает, можно обойтись вообще без доп. обработки.

megaloman
27-05-2022, 18:57
ioSIS, Нужно разбить ее на строки по разделителю "}}}", чтобы получилось: »А зачем это нужно? Тут основная проблема - наличие |.
Я сымитировал вашу утилиту командой More c выдачей строки из текстового файла. Вот два варианта, если устроит выдача результата в кавычках.@Echo Off
cls
Echo Вариант 1
For /f "usebackq tokens=1,2,3,4,5 delims=}" %%i In (`More яяяю.txt`) Do (
Echo "%%i"
Echo "%%j"
Echo "%%k"
Echo "%%l"
Echo "%%m"
)

Echo. &Echo Вариант 2
For /f "usebackq tokens=1,2,3,4,5 delims=}" %%i In (`More яяяю.txt`) Do (
Set "@@a1="%%i""
Set "@@a2="%%j""
Set "@@a3="%%k""
Set "@@a4="%%l""
Set "@@a5="%%m""
)
Echo %@@a1%
Echo %@@a2%
Echo %@@a3%
Echo %@@a4%
Echo %@@a5%
pause
Exit /B

ioSIS
28-05-2022, 12:44
Я сымитировал вашу утилиту командой More c выдачей строки из текстового файла. Вот два варианта, если устроит выдача результата в кавычках.
Код: »

Не устроит)
Плюс, у Вас можно вывести только 5 строк, а их в выводе команды может быть сколько угодно.

Воспользовался советом DJ Mogarych на счет \n в выводе MediaInfo.exe. Но это частный случай с этой утилитой.

Вопрос в общем остается открытым:
Как с помощью CMD разбить строку на подстроки по разделителю, если она содержит спец-символы?

Fors1k
28-05-2022, 13:07
Вопрос в общем остается открытым»
Вам же уже дали готовый код с решением. А cmd устаревший язык, который не используется уже более 20 лет. Не просто так его разработку забросили в 2000г. Microsoft выпустили вместо него PowerShell.
Если так будет понятнее, то вы спрашиваете "как на черно-белом ламповом тв запустить приложение кинопоиск и включить мстителей в 4к", а вам отвечают, что таких тв уже нет ни у кого, и вам нужен смарт-тв с приложениями и 4к разрешением.

ioSIS
28-05-2022, 22:49
Вам же уже дали готовый код с решением. А cmd устаревший язык, который не используется уже более 20 лет. Не просто так его разработку забросили в 2000г. Microsoft выпустили вместо него PowerShell. »

Похоже, Вы правы, цепляться за CMD при наличии более современных и удобных средств - вряд ли разумно.

Вот еще подсказали способ разбивать строку со спецсимволами с помощью WSH. Может пригодиться кому. Код сохранить в .bat и запускать как обычно:


@set @x=0 /*
@echo off
chcp 65001 >nul
set attr="%%StreamKindPos%%|%%Language/String%%|%%Title%%}}}"
pushd "C:\Program Files\MediaInfo\"
FOR /F "usebackq delims=" %%i IN (`mediainfo.exe --Output^=Audio^;%attr% %1`) DO ( set audio=%%i)
popd
set "audio=%audio:"=\*quotes*\%"
cscript /nologo /e:javascript %0 "%audio%"
goto :EOF
*/
var output=WScript.Arguments(0).replace(/\\\*quotes\*\\/gi,'"').replace(/}}}/gi,'\n').slice(0,-1);
WScript.Echo(output);




© OSzone.net 2001-2012