Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/88: Рейтинг темы: голосов - 88, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6

Разделить большой текстовый файл на множество файлов

03.02.2014, 20:38. Показов 16634. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Помогите, пожалуйста, разобраться.
Есть с десяток txt-файлов с примерно таким содержанием:

*слово или фраза из нескольких слов
Несколько строк или предложений.

*слово2 или фраза2 из нескольких слов
Другие несколько строк.


"Слов" в исходном файле может быть около тысячи. Нужно "разобрать" текст на куски в виде файлов с именем слово.txt и содержанием "несколько строк", идущих после "слова". Перед "словами" сейчас присутствует символ "*", но его везде можно заменить на любой "маркер". Пустые строки не имеют значения, будут они, или нет в получившихся файлах.
Заранее спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2014, 20:38
Ответы с готовыми решениями:

Разделить текстовый файл на несколько
Добрый день! Подскажите пожалуйста, как создать bat файл, чтобы он разбивал txt файл, после определенного слова, например такого типа...

Как разрезать большой файл .doc на множество файлов, например, по страницам?
На мобильнике большие файлы медленно открываются.

Файл: Скопировать текст в другой текстовый файл файл, но чётные строки должны быть с большой буквы...
Создать текстовый файл. Скопировать текст в другой текстовый файл файл, но чётные строки должны быть с большой буквы, а нечетные с...

10
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
03.02.2014, 22:24
Вариант 1. Скрипт может "упасть" если в исходном файле попадутся спецсимволы.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
SetLocal EnableExtensions
 
:: Путь и имя исходного файла
set src=text.txt
:: Путь, где создавать разрезанные файлы
set dest=.
 
For /F "UseBackQ Delims=" %%a in ("%src%") do call :SaveText "%%a"
pause
Exit /B
 
:SaveText %1-text
  set "text=%~1"
  if "%text:~,1%"=="*" (set "CurFile=%text:~1%.txt") else (>>"%dest%\%CurFile%" echo %~1)
Exit /B
Вариант 2. Безопасный скрипт, но если в тексте попадутся знаки (!), все они будут поглощены.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
:: Путь и имя исходного файла
set src=text.txt
:: Путь, где создавать разрезанные файлы
set dest=.
 
For /F "UseBackQ Delims=" %%a in ("%src%") do (
  set "text=%%a"
  if "!text:~,1!"=="*" (set "CurFile=!text:~1!.txt") else (>>"%dest%\!CurFile!" echo %%a)
)
pause
Exit /B
В результате в обоих случаях пустых строк не будет.
1
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
03.02.2014, 22:57  [ТС]
Спасибо. Первый вариант вроде заработал, но имена получившихся файлов - в корявой кодировке. Из-за этого, я думаю, споткнулся на десятом слове и выдал:
Непредвиденное появление: Єю.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
03.02.2014, 23:53
Цитата Сообщение от Usta Посмотреть сообщение
но имена получившихся файлов - в корявой кодировке. Из-за этого, я думаю, споткнулся на десятом слове
Не, не из-за того.
Переходим плавно к скрипту № 2 идем теперь на усложнение.
В идеале увидеть бы кусочек файла (в виде файла приложенного к сообщению),
вдруг там у Вас Юникод.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
:: Путь и имя исходного файла
set src=text.txt
:: Путь, где создавать разрезанные файлы
set dest=.
 
chcp 866 >nul 
For /F "UseBackQ Delims=" %%a in ("%src%") do (
  set "text=%%a"
  if "!text:~,1!"=="*" (
    set "Safe_bufer=%%a"
    call :RecodeDosToWin
  ) else (
    >>"!CurFile!" echo %%a
  )
)
pause
Exit /B
 
:RecodeDosToWin
for /f "delims=" %%a in ("!Safe_bufer!") do (
   chcp 1251> nul
   call :convert "%%a" 2>NUL
)
chcp 866 >nul
goto :eof
 
:convert
set "CurFile=%dest%\%~1.txt"
Если не получится, то тогда только решение на VBScript.
++ желательно все же "живой" пример.
0
04.02.2014, 00:37

Не по теме:


для таких огромных объемов есть специальная утилитка, а вернее целый комбайн
Text File Splitter

несколько стратегий деления файлов, плюс возможность создания своих консольных приложений с выбранными вами условиями. Рекомендую. Не надо насиловать комстроку. :)

Миниатюры
Разделить большой текстовый файл на множество файлов  
1
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
04.02.2014, 08:20  [ТС]
Dragokas
Цитата Сообщение от Dragokas Посмотреть сообщение
В идеале увидеть бы кусочек файла (в виде файла приложенного к сообщению),
вдруг там у Вас Юникод.
Пример простой:
*Биржа
Юридическое лицо, обеспечивающее регулярное функционирование организованного рынка биржевых товаров, валют, ценных бумаг и производных финансовых инструментов.
Торговля ведётся стандартными контрактами или партиями (лотами), размер которых регламентируют нормативные документы биржи.
Раньше биржей называли место или здание, где собираются в определённые часы торговые люди и посредники, биржевые маклеры для заключения сделок с ценными бумагами или товарами.
Нет, не Юникод. Пробовал в Notepad++ менять на ANSI, UTF-8, и win-1251 до кучи - результат один: содержимое файлов в нормальной кодировке, а имена файлов в корявой (с вариациями)
Варианты 2.1 и 2.2 выдают ошибку после создания нескольких файлов:
Синтаксическая ошибка в имени файла, имени папки или метке тома.
либо
Системе не удается найти указанный путь.
Видимо, в зависимости от кодировки исходного.

@Root
Насколько я успел разобраться, ТекстФайлСплиттер не сможет проименовать получаемые файлы. Режет либо построчно, либо побайтно, или я ошибаюсь? К тому-же у меня сыплет ошибками НетФрэймворка.
0
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
04.02.2014, 09:17
Usta,
Split By Text Boundary
Split By Regular Expression
это то, что может заинтересовать.
если выбрать любой из этих способов - в Configure Strategy есть флажок - Use as file name.
Насчет фреймворка - надо, видимо обновить его.
Ну а вообще - не понравился, так не понравился. Хозяин барин, я просто предложил.
1
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
04.02.2014, 12:37  [ТС]
Цитата Сообщение от @Root Посмотреть сообщение
Split By Text Boundary
Split By Regular Expression
это то, что может заинтересовать.
если выбрать любой из этих способов - в Configure Strategy есть флажок - Use as file name.
Спасибо, поковыряюсь в этой программулине.
Цитата Сообщение от @Root Посмотреть сообщение
Насчет фреймворка - надо, видимо обновить его.
ФВ должен быть свежим - ставятся все офиц. обновления. Вин7 только 32 б, может поэтому
0
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
04.02.2014, 20:16  [ТС]
Dragokas, а можно немного допилить первый или второй скрипт (из первого Вашего сообщения)? Дело в том, что перепробовал разные варианты с кодировками... Скрипты работают (то 1-й, то 2й, в зав-ти от кодировки), НО получается либо имя файла нормальное+содержимое корявое, либо наоборот.
Файл для пробы приаттачил.

ПС Разница в сохранении формата скрипта (cmd или bat) существует в данном случае?
ППС Text File Splitter так и не смог запустить у себя Поэтому снова прошу помочь.
Вложения
Тип файла: txt text.txt (739 байт, 8 просмотров)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.02.2014, 23:49
Лучший ответ Сообщение было отмечено Usta как решение

Решение

В коде были ошибки. Поправил:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
:: Путь и имя исходного файла
set src=text.txt
:: Путь, где создавать разрезанные файлы
set dest=.
 
chcp 1251 >nul
For /F "UseBackQ Delims=" %%a in ("%src%") do (
  set "text=%%a"
  if "!text:~,1!"=="*" (
    chcp 866 >NUL
    set cp=
    call :recode "%%a"
  ) else (
    if not Defined cp (chcp 1251 >nul& set cp=true)
    call :append "%%a"
  )
)
chcp 866 >NUL
pause
Exit /B
 
:recode
  set "CurFile=%~1.txt"
  set "CurFile=%dest%\!CurFile:~1!"
exit /B
 
:append
  set "buf=%~1"
  >>"!CurFile!" echo !buf!
exit /B
2
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 6
06.02.2014, 08:14  [ТС]
Dragokas, огромное человеческое Спасибо! Работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2014, 08:14
Помогаю со студенческими работами здесь

Разделить один большой .c файл на несколько
Просьба помочь разделить один большой .c файл на несколько. Цели: 1. Разделить куски кода на функции 2. Вынести большие функции...

Разделить один большой txt файл на несколько
Есть на раб столе папка пустая а также есть большой тхт, в нем много строк. Вопрос таков: комп создает в пустой папке по очереди тхт и у...

Прочитать большой текстовый файл > 1Гб
Пытаюсь прочитать большой текстовый файл. 1Гб и более! Строки без пробелов, разделены "\n" Пример файла: "line1\n ...

HTML input file как разделить множество полученых файлов по категориям
Здравствуйте всем! Интересует такое решение задачки. Имеется вот такой вот HTML код <form action=""...

Как сохранить большой текстовый файл в txt?
Вообщем пишу я тест, в конце теста выдаются коротки результаты в балах, но в этот момент, например при открытие этой формы, нужно сохранить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru