Войти

Показать полную графическую версию : [решено] Разбить txt на части по разделителю


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

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


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

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

alpap
16-10-2018, 14:11
измените файл так:


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

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

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

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

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

YuS_2
31-07-2022, 08:38
Помогите доработать данный выше скрипт »
Наверное, если подобные задачи возникают периодически, то имеет смысл перейти на 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
А можно не ловить разделитель, а просто выбрать то, что нужно и отформатировать как нравится (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
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
можно не ловить разделитель »
Дык, powershell же :)
Данные можно обрабатывать так, как хочется... вопрос только в конечном результате, т.е. надо определиться с задачей...

неудобно, что входящие данные находятся в "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
Прочитал справку powershell и сам разобрался. »
:nnn:




© OSzone.net 2001-2012