Показать полную графическую версию : [решено] Разбить txt на части по разделителю
Viktor99
16-10-2018, 10:14
Здравствуйте. Помогите написать батник для разбиения одного txt на части по разделителю. Батник должен быть в папке с исходным файлом. Содержание исходника:
Год: 2018
Жанр: Исторические приключения, Боевик
Формат: RTF,FB2
========================================================================
Год: 2017
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2
========================================================================
Год: 2017-
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2
В обработанные файлы разделитель включаться не должен:
Год: 2017-
Жанр: Боевая фантастика, Зарубежная фантастика, Научная фантастика
Формат: RTF,FB2
измените файл так:
========================================================================
Год: 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
========================================================================
Помогите доработать данный выше скрипт »
Наверное, если подобные задачи возникают периодически, то имеет смысл перейти на 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\'
можно не ловить разделитель »
Дык, 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.