Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Разбить txt на части по разделителю (http://forum.oszone.net/showthread.php?t=337203)

Viktor99 16-10-2018 10:14 2836086

Разбить txt на части по разделителю
 
Здравствуйте. Помогите написать батник для разбиения одного txt на части по разделителю. Батник должен быть в папке с исходным файлом. Содержание исходника:

Год: 2018
Жанр: Исторические приключения, Боевик
Формат: RTF,FB2
========================================================================
Год: 2017
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2
========================================================================
Год: 2017-
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2


В обработанные файлы разделитель включаться не должен:

Год: 2017-
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2

alpap 16-10-2018 14:11 2836133

измените файл так:
Скрытый текст

Код:

========================================================================
Год: 2018
Жанр: Исторические приключения, Боевик
Формат: RTF,FB2
========================================================================
Год: 2017
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2
========================================================================
Год: 2017-
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2


и тогда это будет работать как надо (если в строках не будет разных спецсимволов, иначе лучше брать не bat)
Код:

@echo off
set "f=file.txt"

setlocal enabledelayedexpansion
 <"%f%" (for /f "delims=" %%a in ('find /v ""') do @echo %%a|>nul find "===" && (set /a n+=1& rem:>"f!n!.txt") || (if exist "f!n!.txt" >>"f!n!.txt" echo:%%a))
endlocal
pause>nul


Viktor99 30-07-2022 21:29 2989494

Помогите доработать данный выше скрипт, если в файлах существуют пустые строки. Имеющийся скрипт пустые строки удаляет, а нужно, чтобы они остались. Спасибо.
========================================================================
Год: 2018

Жанр: Исторические приключения, Боевик

Формат: RTF,FB2
========================================================================
Год: 2018

Жанр: Исторические приключения, Боевик

Формат: RTF,FB2
========================================================================

YuS_2 31-07-2022 08:38 2989499

Цитата:

Цитата Viktor99
Помогите доработать данный выше скрипт »

Наверное, если подобные задачи возникают периодически, то имеет смысл перейти на powershell...
Код:

$file = 'test.txt'
$enc = 'utf8'

if ($pscore = $psversiontable.psversion.major -gt 5){
        if ($enc -eq 'utf8'){$enc = 'utf-8'}
}

(gc $file -enc $enc -raw) -split "==+"|%{$i=0}{
        $i++;$_.trim()|out-file ("$i" + '.txt') -enc $enc
}

ЗЫ Количество файлов будет:
n+1
где n - количество разделителей.
Разделитель можно изменить. В данном скрипте, это регулярное выражение "==+", то бишь два и более символа "=", расположенных подряд, будут использоваться в качестве единого разделителя.
Кодировка файла тоже изменяема, в данном случае, это:
Код:

$enc = 'utf8'

DJ Mogarych 31-07-2022 11:22 2989504

А можно не ловить разделитель, а просто выбрать то, что нужно и отформатировать как нравится (Powershell):
Код:

$txt = gc "C:\temp\text.txt"

$year = $txt -match "^Год:"
$genre = $txt -match "^Жанр:"
$format = $txt -match "^Формат:"

for ($c=0;$c -lt $year.count;$c++) {
"$($year[$c])

$($genre[$c])

$($format[$c])
"
}


Viktor99 31-07-2022 11:49 2989506

YuS_2, Спасибо, действительно, через powershell будет лучше. Простите, что наглею, решил вынести скрипт для удобства в отдельную папку с другими скриптами . В самом начале файла я внес полный адрес, где всегда будут храниться исходные данные.
Первая строка: $file = 'C:\Users\Administrator\Desktop\workingg\messages.txt'

Скрипт работает отлично, спасибо. Но получается немного неудобно, что входящие данные находятся в "C:\Users\Administrator\Desktop\workingg\", а разделенные файлы появляются в папке со скриптом. Как можно сделать, чтобы разделенные ложились рядом с исходным файлом, а не рядом со скриптом?

вопрос снят. Прочитал справку powershell и сам разобрался. Нужно перед
(gc $file -enc $enc -raw) -split "==+"|%{$i=0}{
$i++;$_.trim()|out-file ("$i" + '.txt') -enc $enc
}

вставить указание пути:
Set-Location -Path 'C:\Users\Administrator\Desktop\workingg\'

YuS_2 31-07-2022 13:45 2989517

Цитата:

Цитата DJ Mogarych
можно не ловить разделитель »

Дык, powershell же :)
Данные можно обрабатывать так, как хочется... вопрос только в конечном результате, т.е. надо определиться с задачей...

Цитата:

Цитата Viktor99
неудобно, что входящие данные находятся в "C:\Users\Administrator\Desktop\workingg\", а разделенные файлы появляются в папке со скриптом. Как можно сделать, чтобы разделенные ложились рядом с исходным файлом, а не рядом со скриптом? »

Set-location ... можно, конечно, и так, но можно просто указать путь для выходных файлов, а для этого в начало скрипта надо добавить, собственно, путь:
Код:

$outpath = 'C:\Users\Administrator\Desktop\workingg\'
...

и изменить код вывода в файлы:
Код:

...
        $i++;$_.trim()|out-file ($outpath + '\' + $i + '.txt') -enc $enc
...


DJ Mogarych 31-07-2022 15:13 2989525

Цитата:

Цитата Viktor99
Прочитал справку powershell и сам разобрался. »

:nnn:


Время: 21:14.

Время: 21:14.
© OSzone.net 2001-