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

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

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

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


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

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


Прошу помочь

Имеется текстовый файл следующего типа
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст
# 2 Текст2
Ошибка1 текст
Ошибка2 текст
Ошибка4 текст
# 3 Текст3
Ошибка2 текст
Ошибка4 текст
Ошибка5 текст
необходимо разделить на несколько текстовых файлов по следующему условию:
если в части текста которая начинается с символа # и до следующей # встречается фраза "Ошибка1" то всю эту часть текста скопировать в файл 1.txt и т.д.

Отправлено: 10:37, 21-01-2019

 

Ветеран


Contributor


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

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


  • в первом выходном файле — 1 и 2;
  • во втором — 1 и 3;
  • в третьем — 2;
  • в четвёртом — 4;
  • в пятом — опять 4.
Принцип разделения не понятен (и не соответствует описанию из сообщения #3).

Отправлено: 09:35, 22-01-2019 | #11



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

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


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


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

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


Принцип деления такой:

в 1.txt собрали по ошибке
"У aaaaaaaaaaaaaa не указан вес (не заполнено поле Weight)"
это встречалось в 1 и 2

в 2.txt собрали по ошибке
"У aaaaaaaaaaaaaa не указан рост (не заполнено поле Height)"
это встречалось в 1 и 3

в 3.txt по ошибке
"Некорректно заполнено поле SL_KOEF ("Коэффициенты сложности aaaaaaa vvvvvvvv"): не указан КСЛП с IdSl='9112' и значением Z_Sl='1.12'"
это встретилось только в 2

в 4.txt собрали по ошибке
"Не заполнены поля KPG и(или) KSG : KPG= 0, KSG= 0"
это встретилось только в 4

в 5.txt собрали по ошибке
"Несоответствие номера модели КСГ (поле MODEL_ID) периоду оказания МП (MODEL_ID= 0)"
это встретилось только в 4

Отправлено: 11:29, 22-01-2019 | #12


Аватара для YuS_2

Старожил


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

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


Цитата Rey71:
Принцип деления такой: »
И как Вы будете отличать файл 4.txt от 5.txt? По какому принципу?
Логичнее выводить в файл заголовок секции и только саму строку с ошибкой, а не всю секцию целиком...

Но однако, тут слишком всё неоднозначно. Сколько (максимально) типов ошибок может вообще присутствовать в файле?

-------
scio me nihil scire


Отправлено: 14:10, 22-01-2019 | #13


Ветеран


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

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


Rey71,
не лучше ли это все было делать в excel, например, с отдельным столбцом ошибки с выходом на примечание или гиперссылку или список на разновидность, да впрочем там есть где разгуляться по части сортировки и вывода. Или какая-то программа так (в txt) выводит и ничего не поделать уже. Вы понимаете что это целая база уже, а не мелкий сбор пунктов в файле.

Отправлено: 16:08, 22-01-2019 | #14


Ветеран


Contributor


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

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


Rey71, Не знаю, зачем это надо. ИМХО, хотелось бы знать конечную цель. Если для анализа, то надо как-то сформулировать, что анализируется.
Сложновато, но попробуйте
Код: Выделить весь код
@Echo Off
cls
	Set "FileIn=Z:\Box_In\Errors\исходный файл.TXT"
	Set "BoxOut=Z:\Box_In\Errors"

	Set /A is=10000
	Set /A ie=10000

	Set "@@s="
	Set "@@i10001="
	Set "@@N10001="

	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
	Set "@Tdate=%@Tdate:~2%"

	FOR /F "usebackq delims=" %%s IN ("%FileIn%") DO (
		Call Set "SS=%%s"
		Call :Section "%%ss" "%%SS:~0,1%%" 
	)
	Call :Out
Pause
Exit /B 0

:Section
	If %2=="#" (
		Call :Out 
		Set "@@s=%~1"
		Exit /B 0
	)

	Set /A is+=1
	Set "@@i%is%=%~1"
	If "%@@N10001%"=="" (
		Set /A ie+=1
		Call Set "@@N%%ie%%=%~1"
	)
Exit /B 0

:Out
	If "%@@s%"=="" Exit /B 1
	If "@@i10001"=="" Exit /B 2
						Echo %@@s%
rem						Set "@@i"
	
	FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "@@i"`) DO (
		Call Set /A Log=0
		FOR /F "usebackq tokens=1* delims==" %%k IN (`"2>nul Set "@@N""`) DO (
			If /I "%%~j"=="%%~l" (
				Call Set /A Log=1
			)
		)
		Call :Errors %%Log%% "%%~j"
	)

	FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "@@i"`) DO (
		FOR /F "usebackq tokens=1* delims==" %%k IN (`"2>nul Set "@@N""`) DO (
			If /I "%%~j"=="%%~l" (
				Set "NFile=%%k"
				Call :OutFile %%NFile:~3%%
			)
		)
	)

	FOR /F "usebackq tokens=1 delims==" %%i IN (`Set "@@i"`) DO Set "%%i="
	Set /A is=10000
Exit /B 0

:Errors
	If Not %1==0 Exit /B 1
	Call Set /A ie+=1
	Call Set "@@N%ie%=%~2"
Exit /B 0

:OutFile
	Set "OutName=%1"
	Set "OutName=%OutName:~1%.txt"
 
>>"%BoxOut%\%@Tdate%_%OutName%" (
	Echo %@@s%
	FOR /F "usebackq tokens=1* delims==" %%a IN (`Set "@@i"`) DO Echo %%b
)
Exit /B 0
Имена выходных файлов сделал в формате ГГММДДччммсс_nnnn.txt

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 23-01-2019 в 10:29. Причина: Добавил кавычку, которая на выполнение не влияла

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

Отправлено: 17:54, 22-01-2019 | #15


Ветеран


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

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


megaloman, что будет, если во входном файле попадутся угловые скобки?

Отправлено: 00:02, 23-01-2019 | #16


Ветеран


Contributor


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

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


Busla,
Цитата Busla:
что будет, если во входном файле попадутся угловые скобки? »
Думаю, много чего может попасться, чтобы батник сломался. Надо быть уверенным в допустимом наборе символов (Rey71, увы, дал очень мало инфы и потребовал CMD), или надо делать на чём-то другом. Например, vbs.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 23-01-2019 в 00:36.


Отправлено: 00:30, 23-01-2019 | #17


Ветеран


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

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



Исх файл и сорт.7z
странные как для меня решения предлагаются, я как-то так представлял себе задачу:
Код: Выделить весь код
@echo off
set "f0=file.txt"
set "$_err1=Ошибка1"
set "$_err2=Ошибка2"
set "$_err3=Ошибка3"
set "$_err4=Ошибка4"
set "$_err5=Ошибка5"

for /f "tokens=1,2* delims=[]=" %%a in ('set $_^|find /n /v ""') do call :# "%%a" "%%c" "%f0%"
pause& exit

:#
 <"%~3" (for /f "delims= eol=" %%a in ('find /v ""') do @call :ntf "%%a")
 <$ (for /f "tokens=1* delims=[]" %%a in ('more') do @(
   <nul set /p="%%b"|>nul find "%~2" && (
    for /f "delims=" %%$ in ('find "[%%a]"') do @set "s=%%$"& call :v "%~1"
   )
  )
 )& del $ 
exit /b
 
:ntf
 <nul set /p="%~1"|>nul find "#" && (
  if not defined n set /a n=0
  if defined n set /a n+=1
 )
 >>$ (<nul set /p="[%n%]%~1"& echo:)
exit /b

:v
 >>"%~1.txt" (<nul set /p="%s:*]=%"& echo:)
exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:51, 23-01-2019 | #18


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


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

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


Вложения
Тип файла: txt obraz.txt
(1.5 Kb, 5 просмотров)

Медицинское учреждение. Ежемесячно формируется отчет в фонд обязательного медицинского страхования.
Перед отправкой отчета программа ФОМС проверяет отчет на наличие ошибок и формирует текстовый файл. (прикладываю образец файла с первыми двумя пациентами и ошибками по ним)
в файле первая строка начинается с символа # и содержит информацию о пациенте, проводимом лечении и т.д.
следующие строки каждая содержит ошибку которую необходимо исправить и так до строки начинающейся со знака #.

Необходимо разделить этот файл на несколько файлов которые будут группироваться по ошибкам чтобы раздать мед персоналу для исправления ошибок.
причем необходимо учесть следующее:
Строка с ошибкой может быть как одинаковой целиком, например "У новорожденного не указан вес (не заполнено поле Weight)"
так и совпадающей только частью строки, например "Значения полей KPG и KSG не соответствуют справочнику KSG.DBF в отчетном периоде : KPG= 16, KSG=110"
где значения "KPG= 16, KSG=110" могут меняться в разных строках ошибок.

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

Отправлено: 06:35, 23-01-2019 | #19


Ветеран


Contributor


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

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


Цитата Rey71:
как вариант можно создать файл с образцами основных ошибок »
Не «как вариант», а только так, ибо иначе кто будет определять:
Цитата Rey71:
Строка с ошибкой может быть как одинаковой целиком… так и совпадающей только частью строки, »
что где?!

Оптимальный вариант, как я вижу — собирать виды ошибок сразу в виде регулярных выражений, для WSH или PoSH.
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:10, 23-01-2019 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Создать несколько файлов из одного по условию Rey71 Скриптовые языки администрирования Windows 9 28-04-2018 08:13
CMD/BAT - [решено] разбить файл на много файлов по шаблону и каждый файл положить в папку Mezolick Скриптовые языки администрирования Windows 3 03-02-2017 08:38
CMD/BAT - [решено] Как построчно разбить текстовый файл на текстовые файлы содержащие одну строку binwatch@vk Скриптовые языки администрирования Windows 3 09-09-2012 19:59
CMD/BAT - Разбить текстовый файл на части определенного размера. kamcom88 Скриптовые языки администрирования Windows 0 22-03-2012 12:23
CMD/BAT - Как разбить текстовый файл на куски определенного размера? helik Скриптовые языки администрирования Windows 7 16-11-2011 06:35




 
Переход