Форум программистов, компьютерный форум, киберфорум
Софт: Текстовые редакторы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67

Чем разделить .тхт файл , после определенной строки

30.08.2023, 02:02. Показов 4606. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте!
Подскажите пожалуйста чем можно разделить текстовый документ на отдельные файлы?
Есть текстовый документ в котором встречается строка М98P7003, так вот , после этой строки должен начаться новый файл
Пример файла который нужно разделить
Текст текст текст
Текст текст текст
Текст текст текст
M98P7003
Текст текст текст
Текст текст текст
Текст текст текст
M98P7003
Текст текст текст
Текст текст текст
Текст текст текст
M98P7003
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.08.2023, 02:02
Ответы с готовыми решениями:

Как загрузить текстовый файл с определенной строки и разделить его на столбцы
Добрый вечер, подскажите пожалуйста, как написать макрос загрузки текстового файла. Загрузив его с определенной строки, разделить его на...

Как разделить большой тхт-файл на много маленьких фиксированного размера?
Как разделить большой тхт-файл на много маленьких фиксированного размера?Как разделить большой тхт-файл на много маленьких фиксированного...

преобразование АВС.ТХТ в файл 123.ТХТ
Написать программу, преобразующую файл АВС.ТХТ в файл 123.ТХТ. Строки изменяются по следующему правилу: все цифры заменяются на Содержимое...

54
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
26.10.2024, 04:03  [ТС]
Студворк — интернет-сервис помощи студентам
вот этот режет

PowerShell
1
2
3
4
5
6
param ( [Parameter(mandatory=1)] $src, [Parameter(mandatory=1)] $token)
foreach ( $chunk in gc $src -delim $token ) {
    $dst = "{0}.{1}" -f $src, ++$count
    $chunk | Out-File $dst
    gi $dst
}
0
 Аватар для volodin661
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,052
26.10.2024, 04:08
По какому критерию он должен порезать в лоскуты содержимое файла из 17475.TXT ?
0
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
26.10.2024, 04:18  [ТС]
Аааа я понял почему он не режет , потому что нет Oхххх
В старом скрипте который год назад вы писали , он скорее всего резал по M98P7003 , а в этом режет по Oхххх
В самом первом посте я писал что именно по M98P7003 ориентироваться
0
 Аватар для volodin661
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,052
26.10.2024, 04:25
сейчас в программе определён след. критерий:

в начале строки опциональный слэш /, затем большая O, затем серия десятичных цифр, затем откр. круглая скобка (,
затем всё что угодно кроме закрыв. скобки, затем закрывающая круглая скобка )

Добавлено через 2 минуты
если надо резать по M98P7003 - это всё упрощает существенно
0
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
26.10.2024, 04:31  [ТС]
Я понимаю как он режет сейчас .

А как он резал в старом скрипте ?
0
 Аватар для volodin661
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,052
26.10.2024, 04:33
смотри, образец того, как описывается критерий ( по-нашему это называется шаблон ) я тебе показал,

ты мне вот так же описываешь шаблон, не забывая указать, где мне из него извлечь имя файла,
а я это, соответственно, программно реализую.
0
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
26.10.2024, 04:39  [ТС]
Это я понимаю. Я вот что имею ввиду , ведь резать можно не по Oхххх а по M98P7003 именно оно определяет количество программ в общем файле , а не Oхххх

Я не как не пойму как работал старый скрипт ? Откуда он брал имя файла
0
 Аватар для volodin661
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,052
26.10.2024, 04:49
в #6 он резал по M98P7003, a имя файла я придумывал сам
в #22 он резал по О и серии последующ. десят. цифр, не привязываясь к началу строки, поэтому слэши тоже подхватывались.

Добавлено через 10 минут
ладно, завтра подправим. надо все случаи формализовать
0
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
26.10.2024, 04:52  [ТС]
В общем то все понятно и ваш скрипт работает правильно и режет он в правильном месте
Единственное что в строках где содержится М98P7003 стоит переход на следующую строку CRLF , а так все правильно
0
 Аватар для volodin661
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,052
26.10.2024, 04:55
по-взрослому если,
то для нужд автоматизации производства надо от Windows избавляться, это никчёмный кал *,
делать всё на Linux, a лучше даже на FreeBSD



* но если, скажем завязано что-то на ПО типа AutoCAD, который только под Windows, то увы, Windows нужен
0
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
26.10.2024, 05:08  [ТС]
Я работаю в Компас 3D , SolidWorks , SolidCam

Не могли бы вы рассказать как работает вот эта строка ?
"$m" -replace 'M98P7003[\r\n]+', 'M98P7003' -replace '\n', "`r`n" | out-file $dst -nonewline
0
 Аватар для volodin661
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,052
26.10.2024, 15:31
в переменной $m находится программная абстракция, называемая обьект и представляющая собой
результат поиска в содержимом файла кусков текста по заданному мной шаблону.

шаблон тут представляет наибольший интерес.

этот шаблон называют 'регулярным выражением' ( regular expression ) и представляет он собой
некоторый свод правил по поиску кусков текста и описывается с помощью весьма изощренного синтатксиса.
фактически это ещё один язык программирования внутри языка программирования.
чтоб далеко не ходить, вот он, конкретный шаблон для нашего поиска:

'(?ms)/?O\d+[(](.+?)[)].+?(?=/?O\d+|\Z)'


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

следим за курсором регулярного выражения.

(?ms) - это мы пока обсуждаем. вопросительный знак в круглых скобках - это настройка некоторых режимов.
едем дальше.
/? это литерал прямой слэш '/', представляет сам себя. следом за ним знак вопроса. а вот это уже метасимвол.
он говорит о том, что стоящий слева от него '/ 'слэш может появиться в искомом тексте. а может и не появиться.
О литерал O. представляет сам себя.
едем дальше
\d+ бэкслэш - это всегда признал метасимвола. \d -это десятичная цифра (d - decimal ), a знак + после неё это тоже метасимвол и он говорит о том, что таких циферок может быть 1 или больше. '+' - это квантификатор. так его называют.
всё вместе: <в искомом тексте может появиться слэш, затем должна быть буква O, а за ней несколько десятичных цифр>
едем дальше
[(] - квадратные скобки, это всегда метасимволы, внутри них действуют свои правила. называются символьный класс.
находящаяся внутри [] левая круглая скобка это тоже метасимвол, но, будучи внутри символьного класса, теряет свою метасилу и представляет саму себя. есть и альтернативный синтаксис для этого - \(
едем дальше
(.+?) тут сплошные метасимволы. круглые скобки - это метасимволы группировки. группировка того, что внутри них.
а внутри них точка . Точка - это метасимвол. Обозначает, что вместо неё в тексте может появиться любой символ. Абсолютно любой.
какой только есть на этом земном шаре. дальше + -метасимвол-квантификатор, обозначающий, что таких символов может быть один или больше. сочетание .+ представляет собой страшную силу, курсор будет ехать по строке до тех пор, пока не упрётся рогом в её конец.
Но. Но следующий сразу вслед за .+ вопросительный знак ? , ограничивает эту жадность и заставляет курсор быть поскромнее и притормозить, ежели чо. Этими 'ежели чо' будут являться другие правила, которые встретятся по пути.

Эх. Про самое главное-то я забыл. А самым главным является стратегический вопрос - а что мы тут ищем-то ваще ?
Исправляюсь.
Ищем мы большую букву О, которая появляется в начале строки и за ней 4 цифры, но может быть перед буквой О и слэш и дальше, и дальше, вплоть до следующей такой же буквы О и цифр за ней в начале строки. Этот кусок текста между двумя О включительно надо выдрать и сохранить в переменной. А попутно надо ещё сохранить в переменной текст между круглых скобок в той же строке, который будет являться по нашей задумке именем файла, в который и будет записан впоследствии этот выдранный текст. И так по всему тексту.

Возвращаемся.
далее курсор регулярного выражения видит:
(?=/?O\d+|\Z)
тут тоже сплошь метасимволы.
вопросительный знак после круглых скобок и знак = сразу после этого означает опережающую проверку того, что находится дальше по движению курсора по искомой строке. то есть, курсор тут останавливается, никуда не едет, но заглядывает вперёд в будущее.
Как можно догадаться, есть ещё и назад в будущее, но это не кино Земекиса, а реальность и выглядит она вот так (?<=символы)
Итак, заглянуть вперёд - это вот так (?=символы), а, назад вот так (?<=символы). Почему заглядывание вперёд не выглядит вот так (?>=), а потому что символ > исторически оказался занят другими функциями. Печально. Но с этим можно смириться.
По-английски это дело называется Look around метасимволы.
Возникает вопрос, почему курсору надо остановиться и заглядывать вперёд, а не ехать дальше, как он и делал до этого ?
Ответ такой, пока курсор едет, все проезжаемые им символы сохраняются в псевдобуфере и их потом можно извлечь,
а если просто посмотреть, то это дедушке бесплатно, ничего не сохранится.
Итак, (?=/?O\d+|\Z) означает, что курсор стоит и видит вдалеке опять ту самую букву О и цифры после неё или он видит конец своего жизненного пути, пардон, конец файла. | - это или, метасимвол \Z - это конец файла ( мнемоника: Z - конечная буква алфавита )

И вот с такими мыслями курсор мотается взад-вперед по тексту; дёргаться вперёд-назад его принуждает механизм регулярных выражений
( Regex Engine ), а точнее, заложенная внутри этого механизма реализация математической теории Конечных Автоматов ( Finite Automation )
DFA - детерминированные конечные автоматы
NFA - недетерминированные конечные автоматы. Смотрите википедию.

Есть метасимволы, которые могут управлять механизмом Regex, так сказать его тюнить, но сейчас не об этом.
( В частности, тот самый метасимвол >, заставляет regex отказаться от дёрганья курсора и идти вперёд и только вперёд, что позволят снизить затраты на поиск )


Итак. Регулярное выражение (?ms)/?O\d+[(](.+?)[)].+?(?=/?O\d+|\Z) выдерет из всего текста все куски от O до O
и предоставит мне доступ к ним через переменную $m. ( см. код выше )

Добавлено через 20 минут
Как ни странно это может показаться, но весь этот птичий язык отлично укладывается в голове
и вытравить его оттуда уже невозможно. парадокс. меня хоть ночью разбуди, оттарабаню без запинки всё про метасимволы, правила, режим жадности, режим ревности, символьные классы, захваты, заглядывания, back tracking, рекурсивные вызовы.

Главным языком планеты по реализации рег. выражением является Perl. С этим никто не спорит.
Механизм называется PCRE. ( perl compatible regular expression ). Есть и другие механизмы.
У Java свой, у Python свой, у Ruby свой; но они похожи, очень похожи, сильно переучиваться не придётся, так, по мелочи.

Добавлено через 16 минут
Цитата Сообщение от Dez33 Посмотреть сообщение
Не могли бы вы рассказать как работает вот эта строка ?
"$m" -replace 'M98P7003[\r\n]+', 'M98P7003' -replace '\n', "`r`n" | out-file $dst -nonewline
в переменной $m находится обьект с результатами работы Regex;
оператор двойных кавычек вокруг переменной заставит её выдавить из себя результат просто в виде искомого текста,
а это, как мы уже знаем, кусок текста между буквами O.

оператор -replace ''M98P7003[\r\n]+', 'M98P7003' заменит в данном тексте последовательность символов M98P7003 и находящиеся за ней несколько метасимволов \r это <CR> и \n это <LF> на M98P7003 , то есть, удалит символы <CR> и <LF>.
\r и \n находятся в квадратных скобках, это символьный класс, то есть порядок символов в нём неважен, важно только их (<CR> и <LF>) возможное наличие. За классом [] стоит +, то есть, таких символов может быть много в любом сочетании. всех без жалости удалит.
1
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
27.10.2024, 03:52  [ТС]
Спасибо большое ! Очень познавательно !
Получается что вторую часть строки можно не писать?
', 'M98P7003' -replace '\n', "`r`n" | out-file $dst -nonewline
В первой части уже происходит удаление CRLF?
0
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
27.10.2024, 14:55  [ТС]
Или вторая часть начинается вот с этого места ?
-replace '\n', "`r`n" | out-file $dst -nonewline

volodin661, я не совсем понял что происходит вот в этой части "$m" -replace 'M98P7003[\r\n]+', 'M98P7003'
Тут происходит удаление CRLF в строке M98P7003 или замена M98P7003 CRLF на M98P7003 или и то и другое сразу ?

Добавлено через 18 минут
Или происходит удаление M98P7003 с метасимволами и замена этой строки на M98P7003 без метасимволов ? Или удаления ни какого нет и просходит просто замена одного на другое ?

Добавлено через 1 час 52 минуты
В переменной dst я так понимаю хранится значение переменной mmm ,т.е. символы заключенные в круглые скобки ,которое получено в результате работы regex ?
Что делает вот эта часть -replace '\n', "`r`n" | и -nonewline ?
0
2 / 2 / 0
Регистрация: 23.08.2023
Сообщений: 67
30.10.2024, 11:40  [ТС]
Вот полностью рабочий скрипт

PowerShell
1
2
3
4
5
6
7
8
9
10
param( [Parameter(mandatory)]$file )
 
$rx      = '(?ms)/?O\d+[(](.+?)[)].+?(?=/?O\d+|\Z)'
$content = Get-Content $file -raw
$mmm     = [regex]::Matches($content, $rx)
 
foreach ( $m in $mmm ) {
    $dst = $m.Groups[1].Value + ".TXT"
    "$m" -replace 'M98P7003[\s]+', 'M98P7003' -replace '\n', "`r`n" -replace '\s\r\n', "`r`n" | out-file $dst -nonewline
}
Спасибо большое volodin661,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2024, 11:40

Считать файл *.тхт и удалить все сиволы после заданного или перед ним
Собственно есть ли у кого программка? Суть, считывать тхт файл и удалять, либо перед заданным символом, все слова и символы, либо после...

Программа которая читает .тхт и меняет номер после определённого словосочетания, сохраняет файл
У меня очень большой текст и среди текста нужно найти номер он будет от 0,01 до 1000,99 пример Тут мусорный текст Тут мусорный...

Разделить имя файла тхт на слова
Подскажите как разделить имя файла Пр: Иванов_Иван_Иванович.txt на слова. Считать как i=Иванов, j=Иван, k=Иванович и вывести в...

Нужно добавить сложение и вычитание определенной строки 1 матрицы с определенной строкой другой,при этом выбор строки вр
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...

Вставка текста после определенной строки
Есть код который вставляет данные формы в таблицу html. все бы хорошо но он вставляет код в последнюю строку файла. А как сделать что бы...


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

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
Новые блоги и статьи
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru