Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Разбить txt на части по разделителю

Ответить
Настройки темы
CMD/BAT - [решено] Разбить txt на части по разделителю

Новый участник


Сообщения: 17
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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


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

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

Отправлено: 10:14, 16-10-2018

 

Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
========================================================================
Год: 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:11, 16-10-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 17
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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

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

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

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

Отправлено: 21:29, 30-07-2022 | #3


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1167
Благодарности: 486

Профиль | Отправить PM | Цитировать


Цитата 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'

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 31-07-2022 в 08:49.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:38, 31-07-2022 | #4


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6484
Благодарности: 1463

Профиль | Отправить PM | Цитировать


А можно не ловить разделитель, а просто выбрать то, что нужно и отформатировать как нравится (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])
"
}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:22, 31-07-2022 | #5


Новый участник


Сообщения: 17
Благодарности: 1

Профиль | Отправить PM | Цитировать


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\'

Последний раз редактировалось Viktor99, 31-07-2022 в 12:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:49, 31-07-2022 | #6


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1167
Благодарности: 486

Профиль | Отправить PM | Цитировать


Цитата 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
...

-------
scio me nihil scire. Ѫ


Отправлено: 13:45, 31-07-2022 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6484
Благодарности: 1463

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 15:13, 31-07-2022 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Разбить txt на части по разделителю

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] разбить по строкам txt shadowbat Скриптовые языки администрирования Windows 54 10-11-2015 16:20
CMD/BAT - [решено] Разбить txt файл по строкам и файлам Acred Скриптовые языки администрирования Windows 9 12-10-2015 18:08
Прочее - Разбить архив на части venuko Общий по Linux 12 30-06-2015 09:38
HDD - Как разбить жесткий на 3 части MaJlb4uK Хочу все знать 4 01-09-2007 20:27
Как разбить mp3 на части Qwe1 Хочу все знать 11 06-10-2006 19:03




 
Переход