![]() |
Удалить в текстовом файле все строки кроме одной нужной.
Вложений: 1
Добрый.
Есть однотипные файлы txt. В них строка №2. Очень длинная. Явно превышающая стандартное ограничение. find и findstr пишут "длинная строка" txt во вложении. Начинается нужная строка всегда с "audioContent". Нужно: 1) скопировать строку №2 из source.txt в out.txt. или в source.txt удалить ВСЕ строки кроме №2. В идеале, нужно решение без привязки к искомым словам, а просто к номеру строк. 2) В результирующем txt удалить пробелы, слово "audioContent" и (")двойные кавычки(") |
Берём в руки sed, и:
Код:
sed -i.bak "2!d" *.txt sed не является штатным средством, однако есть много различных портов под винду. |
Powershell
Код:
$c = Get-Content -Path "C:\temp\source.txt" |
Конкретно для этого файла.
Код:
(Get-Content .\source.txt | ConvertFrom-Json).audioContent | Set-Content out.txt |
Foreigner, надо же, только сегодня написал в канале про ConvertFrom-Json и тут же не увидел его :)
|
Цитата:
Цитата:
Скрытый текст
{
"audioConfig": { "audioEncoding": "LINEAR16", "pitch": 0, "speakingRate": 1 }, "input": { "text": "Тест речевого движка" }, "voice": { "languageCode": "ru-RU", "name": "ru-RU-Wavenet-B" } } Можно ли реализовать замену Тест речевого движка на любую другую фразу (длинную и с символами) в этом файле посредством cmd/powershell/стороннего софта? В идеале, чтобы после ввода нового текста (до того как он заменит собой Тест речевого движка) он как бы становился в одну строку...без пробелов между строками, абзацев и тд. (как если вы, например, скопируете содержимое любой +/- интернет-статьи и вставите скажем в адресную строку браузера хром, а потом скопируете от туда..там автоматом весь текст делается в 1 строку.) Привязаться можно разве что к "text": , т.к другие параметры могут быть измененены/смещены и т.д. (в т.ч и Тест речевого движка) Удалить, например в text.json нужную строку по номеру (как с sed) и вместо нее вставить нужную - не выйдет, т.к номер строки с ""text":" может меняться. |
9119, можно. Только желателен сам файл, целиком, именно в виде файла. Ибо: кодировка, BOM, вид концов строк.
«Привязываться» в json, как и в любом другом структурированном файле, нужно по пути, а не «найти текст-заменить». Цитата:
|
Вложений: 1
Прикрепил.
|
Не совсем понятно зачем удалять строки. Json можно изменить:
Код:
$json = Get-Content text.json | ConvertFrom-Json |
Цитата:
Я так понял это powershell. Тогда, если можно, немного уточну задачу.. 1) $json = Get-Content text.json | ConvertFrom-Json 2) здесь нужно вывести окно с запросом о вводе текста (при вводе текста задается значение переменной). Не обязательно отдельным окном, но желательно. Скрипт при этом останавливается, пока не введем нужный текст. 3) $json.input.text = "переменная" 4) $json | ConvertTo-Json | Set-Content new.json Простите что так на пальцах... |
Цитата:
Код:
$json.input.text = Get-Clipboard PS. Если несколько строк, и это не поддерживается речевым движком, то можно их сконвертировать в одну строку: Код:
$json.input.text = Get-Clipboard | Out-String |
Цитата:
и скажем нажимешь сtrl+с 2-3 раза... тогда такой вариант как я понимаю не подходит... Как будет выглядить вставка из файла? p.s. можно и без рисования окошка... достаточно чтобы скрипт стал на паузу и запросил ввод текста (чтоб можно было текст несколько раз копирнуть в данный сркипт.) |
Цитата:
Код:
$text = Get-Content file.txt |
Foreigner, можно совместить оба подхода — подставлять в тамошний InputBox default'ом значение из Буфера обмена. Тут тебе и возжожность визуального контроля, и возможность ручной коррекции — невеликая плата за лишнее нажатие Enter.
|
Цитата:
|
Мне кажется надо просто параметр к скрипту добавить. Зачем останавливать скрипт и ждать ввода, указывайте сразу.
Выглядит как-то так http://forum.oszone.net/post-2942327.html#post2942327 |
Цитата:
Тут как раз надо чтоб копировать из буфера, с возможностью корректировки на лету так сказать, не лазя по доп файлам... |
Цитата:
Код:
Add-Type -AssemblyName 'Microsoft.VisualBasic' |
Цитата:
Код:
$json = Get-Content text.json | ConvertFrom-Json |
Не проверялось:
Код:
Add-Type -AssemblyName 'Microsoft.VisualBasic' |
Цитата:
Окно только под себя настрою, дабы текст можно было удобнее редактировать. |
Iska, можно проще поступить (без окон) и бейсик не привлекать:
Цитата:
Цитата:
Код:
$json = Get-Content text.json | ConvertFrom-Json |
YuS_2, не то. Из-под консоли — Read-Host консольный будет, плюс лишнее действие нужно.
|
Цитата:
Но если при этом стать в это поле, и нажать "вставить", вставляется только малое количество текста (500-1000 символов) По умолчанию какое-то ограничение на кол-во символов для InputBox? |
Цитата:
А какое лишнее действие? Ровно столько же, как и в окне. |
Цитата:
Планирую в нем сделать листбоксы и для настройки других параметров в text.json. Помогите разобраться с вводом текста в поле, пож. Пример: копируем из статьи 3 абзаца. Между абзацами - пустые строки (1-3 пустых строки). Вставляем в поле - вставляется только первый абзац, т.е все символы до первой пустой строки. Если предварительно сделать все 3 абзаца в 1 строку - то в поле вставляется весь текст. 1) Как-то можно побороть такое неудобство, чтобы не нужно было каждый раз в 1 строку все делать, чтобы это было автоматом при вставке? 2) Поле для ввода текста очень узкое (в 1 строку буквально). Когда вставляешь туда много текста - редактировать его там очень неудобно. Хотелось бы иметь 8-10 строк высоты.. в идеале с возможностью скрола. Пробовал задавать ширину и высоту поля ввода. Ширина тянется, а вот высота - нет. Вот так, на сейчас, окно выглядит
$p='E:\11\bin'
$json = Get-Content $p\text.json | ConvertFrom-Json Add-Type -assembly System.Windows.Forms $main_form = New-Object System.Windows.Forms.Form $main_form.Text ='google text-to-speech' $main_form.Width = 500 $main_form.Height = 500 $main_form.AutoSize = $true $TextBox = New-Object System.Windows.Forms.TextBox $TextBox.Width = 450 $TextBox.AutoSize = $true $TextBox.Location = New-Object System.Drawing.Point(50,200) $TextBox.Text = Get-Clipboard -Format Text $main_form.Controls.Add($TextBox) $button = New-Object System.Windows.Forms.Button $button.Text = 'OK' $button.Location = New-Object System.Drawing.Point(400,250) $button.add_Click({Click_Button}); $main_form.Controls.Add($button) function Click_Button { $json.input.text = $TextBox.Text $json | ConvertTo-Json | Set-Content $p\text.json } $main_form.ShowDialog() |
YuS_2, InputBox даёт возможность зараз подставить умолчальное значение из Буфера обмена. И не во всех ОС работает вставка в окно консоли без предварительных настроек.
9119, с предыдущей страницы: Создание настраиваемого поля ввода - PowerShell | Microsoft Docs. |
Вложений: 1
Iska,
все дело в том, что как не крути не получается у меня сделать в несколько строк это. Пробовал через TextBox, ListBox. ComboBox. Все время одна строка... ( upd: решил. Код:
$TextBox.Multiline = $True; Также в данном поле не работает почему-то сочетание ctrl+a, например. Если владеете инфой - объясните на пальцах, пож. |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Косо-криво на верхнем уровне можно обойти своим обработчиком: Скрытый текст
Код:
Add-Type -AssemblyName System.Windows.Forms Цитата:
|
Цитата:
Код:
... |
YuS_2, спасибо, ясно. В этом случае мы не видим промежуточный текст.
|
Спасибо всем кто отозвался!
Впринципе результат удовлетворительный и тему можно помечать как решенную, но все же попрошу помощи в оптимизации "написанного"). А именно: (опишу процесс, чтобы было более понятно) Все делается в PS (GUI для работы с google text-to-speech): 1) через окно пишем нужные параметры в text.json для последующего запроса на сервак. 2) Шлем запрос на сервак, ответ сервака пишем в source.txt здесь таймаут (ждем пока пишется ответ с сервака) 3) Корректируем source.txt как надо и пишем результат в out.txt здесь таймаут (ждем обработки п.3) 4) Еще корректируем нюансы и пишем полученное в out1.txt здесь таймаут (ждем отработки п.4) 5) Перекодируем out1.txt в конечный файл mp3. Нужно как-то убрать таймауты... А вот как- ума не приложу. Поясню - тестил на небольших статьях на 2 минуты, поставил после п2 таймаут в 10 сек, работает корректно. Но если этот текст будет минут на 15-20, то уже 10сек таймаута будет мало..п.3 начнется раньше, чем будет записан source.txt.... и будет ошибка на выходе. Надеюсь понятно объяснил...( p.s. крутится идея как-то привзязаться к наличию и размеру txt файлов (например, если source.txt создан и размер его больше чем 0 байт - тогда переходим к следующему шагу, ну или как-то так). Нужен универсальный вариант, без подбора таймаутов вручную, чтобы работало с любой длинной текста. сам скрипт
echo off | Out-Null
$p='E:\11\bin' $s='E:\11' echo "" echo "" echo ("=================================================Google Text-To=Speech=================================================") echo "" timeout /t 2 | Out-Null echo ("1) Скачиваем файл...") echo "" start $p/hidec.exe download.bat timeout /t 10 | Out-Null echo ("2) Выделяем код...") echo "" findstr /I "audioContent" $p\source.txt > $p\out.txt del $p\source.txt timeout /t 2 | Out-Null echo ("3) Обработываем полученный код...") echo "" start $p/hidec.exe text_mod.bat timeout /t 5 | Out-Null echo ("4) Конвертируем в mp3...") echo "" echo "" & $p\b64.exe -d out1.txt $s\audio\sound.mp3 del $p\out1.txt echo ("=========================================================Готово!================================== ====================") timeout /t 2 | Out-Null explorer $s\audio exit |
Цитата:
Код:
using namespace System.Speech |
Цитата:
Код:
...{$a;write-host $a} else {... |
Цитата:
Просто сам додумать не могу как избавится от таймаутов... |
Цитата:
|
Цитата:
Но меня опять терзают смутные сомнения :) , что первоначальная задача растет, как на дрожжах, в нечто большее, чем предполагалось изначально, при том, что она так и не сформулирована в законченном виде... то есть простор для фантазий у нас огромен, если не бесконечен. :) |
Помогите офоормить правильно для PS:
помесь ps, cmd и ерунды)
Код:
$p='рабочая/папка' проверяем наличие в папке файла source.txt, и переходим к выполнению команд, если файла там нет - повторяем поиск...и циклим поиск пока файл там не появится. В идеале чтобы проверяло не только наличие файла, но и его размер, чтобы он был >0 |
Цитата:
|
Цитата:
Реализовал через проверку размера файла и цикла while. Код:
Write-Host "1) Загрузка файла..." Спасибо всем за помощь и наводки! |
Время: 16:06. |
Время: 16:06.
© OSzone.net 2001-