PDA

Показать полную графическую версию : [решено] Удалить в текстовом файле все строки кроме одной нужной.


Страниц : 1 [2] 3

9119
17-12-2020, 01:38
Не проверялось »
да, это похоже то, что нужно... работает. и текст в одну строку переводится, без пробелов.
Окно только под себя настрою, дабы текст можно было удобнее редактировать.

YuS_2
17-12-2020, 07:58
Iska, можно проще поступить (без окон) и бейсик не привлекать:

как это совместить с вариантом предложенным на предыдущей странице? »
достаточно чтобы скрипт стал на паузу и запросил ввод текста »
$json = Get-Content text.json | ConvertFrom-Json
$json.input.text = read-host "Пожалуйста, введите или вставьте из буфера текст"
$json | ConvertTo-Json | Set-Content new.json

Iska
17-12-2020, 08:19
YuS_2, не то. Из-под консоли — Read-Host консольный будет, плюс лишнее действие нужно.

9119
17-12-2020, 10:42
работает. и текст в одну строку переводится, без пробелов »
заметил, что если запускать скрипт с текстом в буфере (скажем 5000 символов), то весь текст уже в поле ввода (что, к слову очень удобно)...
Но если при этом стать в это поле, и нажать "вставить", вставляется только малое количество текста (500-1000 символов)
По умолчанию какое-то ограничение на кол-во символов для InputBox?

YuS_2
17-12-2020, 11:34
Из-под консоли — Read-Host консольный будет, плюс лишнее действие нужно. »
Почему не то? Вроде, как раз, это и требовалось... там я процитировал. Окно никаких преимуществ, всё равно, не даст ведь.
А какое лишнее действие? Ровно столько же, как и в окне.

9119
17-12-2020, 13:14
Вроде, как раз, это и требовалось »
нужны были разные варианты, но предпочтительнее все таки окно отдельное.
Планирую в нем сделать листбоксы и для настройки других параметров в 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()

Iska
17-12-2020, 16:54
YuS_2, InputBox даёт возможность зараз подставить умолчальное значение из Буфера обмена. И не во всех ОС работает вставка в окно консоли без предварительных настроек.

9119, с предыдущей страницы: Создание настраиваемого поля ввода - PowerShell | Microsoft Docs (https://docs.microsoft.com/ru-ru/powershell/scripting/samples/creating-a-custom-input-box?view=powershell-7.1).

9119
17-12-2020, 17:11
Iska, я изучил эту информацию и не только ее...
все дело в том, что как не крути не получается у меня сделать в несколько строк это.
Пробовал через TextBox, ListBox. ComboBox.
Все время одна строка... (
upd: решил.
$TextBox.Multiline = $True;

Но, все же непонятно как добавить скрол, если вставленный текст весь не виден в окне (приходится опускаться/подыматься стрелками клавы)
Также в данном поле не работает почему-то сочетание ctrl+a, например.
Если владеете инфой - объясните на пальцах, пож.

YuS_2
17-12-2020, 19:02
нужны были разные варианты, но предпочтительнее все таки окно отдельное.
Планирую в нем сделать листбоксы и для настройки других параметров в text.json. »
Ну, это уже другое дело. Раз уж нравится больше настраиваемая форма, то надо в условия задачи это и вписать...

InputBox даёт возможность зараз подставить умолчальное значение из Буфера обмена. »
Это, как раз, не проблема, один условный блок всё решает...

И не во всех ОС работает вставка в окно консоли без предварительных настроек. »
С этим уже хуже. Но и ТС, вроде уточнил, что форма подходит больше...

Iska
17-12-2020, 19:47
Но, все же непонятно как добавить скрол, если вставленный текст весь не виден в окне (приходится опускаться/подыматься стрелками клавы) »
View Multiple Lines in TextBox Control - Windows Forms .NET Framework | Microsoft Docs (https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-view-multiple-lines-in-the-windows-forms-textbox-control?view=netframeworkdesktop-4.8)

Также в данном поле не работает почему-то сочетание ctrl+a, например. »
Если задано свойство .Multiline — не работает. Вроде как старый, известный баг. Который то «лечится», то возвращается заново.

Косо-криво на верхнем уровне можно обойти своим обработчиком:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

[System.Windows.Forms.Application]::EnableVisualStyles()

$oForm = New-Object System.Windows.Forms.Form

$oForm.Text = 'Sample form'
$oForm.Size = New-Object System.Drawing.Size(300,200)
$oForm.StartPosition = 'CenterScreen'

$oTextBox = New-Object System.Windows.Forms.TextBox
$oTextBox.Location = New-Object System.Drawing.Point(10,40)
$oTextBox.Size = New-Object System.Drawing.Size(260,80)
$oTextBox.Multiline = $true
$oTextBox.AcceptsReturn = $true
$oTextBox.WordWrap = $false
$oTextBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Both

$oTextBox.Add_KeyDown({
if ($_.Modifiers -eq [System.Windows.Forms.Keys]::Control -and $_.KeyCode -eq [System.Windows.Forms.Keys]::A) {
$oTextBox.SelectAll()
}
})

$oForm.Controls.Add($oTextBox)

$oForm.Add_Shown({$oTextBox.Select()})
$oForm.ShowDialog()


Это, как раз, не проблема, один условный блок всё решает... »
Поясните примером.

YuS_2
17-12-2020, 21:38
Поясните примером. »
типа:
...
$json.input.text = if ($a = get-clipboard){$a}else{read-host "Пожалуйста, введите или вставьте из буфера текст"}
...

Iska
17-12-2020, 22:55
YuS_2, спасибо, ясно. В этом случае мы не видим промежуточный текст.

9119
18-12-2020, 02:45
Спасибо всем кто отозвался!
Впринципе результат удовлетворительный и тему можно помечать как решенную, но все же попрошу помощи в оптимизации "написанного").
А именно: (опишу процесс, чтобы было более понятно)

Все делается в 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

Foreigner
18-12-2020, 04:37
google text-to-speech »

А он лучше, чем штатный голосовой движок? Например переводим текст в wav:

using namespace System.Speech
using namespace System.Speech.Synthesis

param (
[Parameter (Mandatory = $false, ValueFromPipeline = $true)]
[string]
$text = $(Get-Clipboard | Out-String),

<# Надо подключать дополнительные "голоса", через реестр, например Павла.

[Parameter(Mandatory = $false)]
[VoiceGender]
$sex = 'female',

#>

[Parameter(Mandatory = $false)]
[string]
$culture = 'ru-RU'
)

if ($PSEdition -eq 'Core')
{ Write-Warning 'Not Working on PowerShell 7'; return }


$speaker = [SpeechSynthesizer]::new()

if ($culture -eq 'en-US')
{
$speaker.SelectVoice('Microsoft Zira Desktop')
$speaker.Rate = -1
}

else
{
$speaker.SelectVoice('Microsoft Irina Desktop')
$speaker.Rate = 1
}

$speaker.SetOutputToWaveFile("$HOME\Desktop\out.wav")
$speaker.Speak($text)

Start-Sleep -Milliseconds 1500

$speaker.Dispose()

YuS_2
18-12-2020, 07:51
В этом случае мы не видим промежуточный текст. »
Если очень надо, то можно выводить в консоль буфер:
...{$a;write-host $a} else {...

9119
18-12-2020, 09:49
А он лучше, чем штатный голосовой движок »
да, значительно.
Просто сам додумать не могу как избавится от таймаутов...

Iska
18-12-2020, 14:43
Если очень надо, то можно выводить в консоль буфер: »
[Произносится медленно, нараспев:] А поправить :)? В смысле — ежели надо не только вывести, но и оперативно поправить содержимое и зараз же продолжить?

YuS_2
18-12-2020, 20:42
В смысле — ежели надо не только вывести, но и оперативно поправить содержимое и зараз же продолжить? »
Это да, понятно, что консольный вывод не предназначен для редактирования...
Но меня опять терзают смутные сомнения :) , что первоначальная задача растет, как на дрожжах, в нечто большее, чем предполагалось изначально, при том, что она так и не сформулирована в законченном виде... то есть простор для фантазий у нас огромен, если не бесконечен. :)

9119
18-12-2020, 21:15
Помогите офоормить правильно для PS:

$p='рабочая/папка'

:CHECK1
if (Test-Path -Path $p\source.txt=true) { #Test-Path возвращает true, если файл существует

write-host "Файл скачан!"
goto :RUN1
else goto :CHECK1
}


:RUN1
%Команда1%
%Команда2%
%Команда3%


проверяем наличие в папке файла source.txt, и переходим к выполнению команд, если файла там нет - повторяем поиск...и циклим поиск пока файл там не появится.
В идеале чтобы проверяло не только наличие файла, но и его размер, чтобы он был >0

Iska
18-12-2020, 22:00
Но меня опять терзают смутные сомнения , что первоначальная задача растет, как на дрожжах, »
Ага. Очередная «Каша из топора»™ :).




© OSzone.net 2001-2012