Показать полную графическую версию : [решено] разбить текстовый файл на несколько по условию
Прошу помочь
Имеется текстовый файл следующего типа
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст
# 2 Текст2
Ошибка1 текст
Ошибка2 текст
Ошибка4 текст
# 3 Текст3
Ошибка2 текст
Ошибка4 текст
Ошибка5 текст
необходимо разделить на несколько текстовых файлов по следующему условию:
если в части текста которая начинается с символа # и до следующей # встречается фраза "Ошибка1" то всю эту часть текста скопировать в файл 1.txt и т.д.
megaloman
21-01-2019, 11:58
Rey71, лучше бы Вы дали образец реального файла, так как абстракция Ошибка1 не гарантирует адекватное решение. Как минимум, хотелось бы видеть реальные представления Ошибка1 Ошибка2. Попутный вопросы:
1. Сколько ориентировочно строк в файле?
2. Если в текстовом файле Ошибка1 и т д встречается многократно, копировать в выходной файл каждую строку или только первую?
3. Сообщение Ошибка1 и т д содержит пробелы?
файл содержит персональные данные - не есть хорошо их показывать
1. строк примерно 2000
2. если ошибка встречается многократно то копировать в выходной файл каждую строку.
3. Сообщение Ошибка1 содержит пробелы.
на выходе хотелось бы получить
1.txt (Ошибка1)
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст
# 2 Текст2
Ошибка1 текст
Ошибка2 текст
Ошибка4 текст
2.txt (ошибка2)
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст
# 2 Текст2
Ошибка1 текст
Ошибка2 текст
Ошибка4 текст
# 3 Текст3
Ошибка2 текст
Ошибка4 текст
Ошибка5 текст
3.txt (ошибка3)
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст
и т.д.
файл содержит персональные данные »У вас их никто и не спрашивает. Да и не интересно это никому. Просто замените на что-нибудь абстрактное.
Нужен сам принцип построения вашего документа.
2. если ошибка встречается многократно »Многократно это больше чем 1+?
megaloman
21-01-2019, 14:00
3. Сообщение Ошибка1 содержит пробелы. » Где кончается Ошибка1 и начинается текст? Приведите примеры строк.
Пример исходного файла
# 1 ВС '111 111111', , д/р 11.11.1111, муж, 11111111, , док. s15113652827
У aaaaaaaaaaaaaa не указан sss (не заполнено поле Weight)
У aaaaaaaaaaaaaa не указан qqqq (не заполнено поле Height)
# 2 ВС '2222 22222', , д/р 22.22.2222, муж, 22222222,, док. s03560575449
Некорректно заполнено поле IT_SL ("Итоговый коэффициент сложности ggggggg gggggggg"): It_Sl='1.18', д.б. '1.12'
У aaaaaaaaaaaaaa не указан sss (не заполнено поле Weight)
megaloman
21-01-2019, 14:15
Rey71, Ошибка1 это У aaaaaaaaaaaaaa не указан sss
А текст в скобках?
У aaaaaaaaaaaaaa не указан sss (не заполнено поле Weight)
У aaaaaaaaaaaaaa не указан qqqq (не заполнено поле Height) »
Ничего не понятно...
Как будет строка идентифицироваться, чтобы было однозначное соответствие определенному выходному файлу?
Т.е., например, вот тут есть соответствие:
Ошибка1 -> 1.txt
Ошибка2 -> 2.txt
...
Ошибка4 -> 4.txt
а вот тут:
1.txt (Ошибка1)
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст
# 2 Текст2
Ошибка1 текст
Ошибка2 текст
Ошибка4 текст
2.txt (ошибка2)
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст
# 2 Текст2
Ошибка1 текст
Ошибка2 текст
Ошибка4 текст
# 3 Текст3
Ошибка2 текст
Ошибка4 текст
Ошибка5 текст
3.txt (ошибка3)
# 1 Текст1
Ошибка1 текст
Ошибка2 текст
Ошибка3 текст »
и вот здесь:
# 1 ВС '111 111111', , д/р 11.11.1111, муж, 11111111, , док. s15113652827
У aaaaaaaaaaaaaa не указан sss (не заполнено поле Weight)
У aaaaaaaaaaaaaa не указан qqqq (не заполнено поле Height)
# 2 ВС '2222 22222', , д/р 22.22.2222, муж, 22222222,, док. s03560575449
Некорректно заполнено поле IT_SL ("Итоговый коэффициент сложности ggggggg gggggggg"): It_Sl='1.18', д.б. '1.12'
У aaaaaaaaaaaaaa не указан sss (не заполнено поле Weight) »
Как отбирать строки, чтобы они попали в тот файл, в который требуется?
Rey71, возьмите Ваш исходный файл. Произвольно обфусцируйте в нём персональные данные. Сделайте из него «ручками» потребные текстовые файлы с потребными именами. Упакуйте всё это в архив, каковой приложите к сообщению.
Прошу прощения, не смог правильно объяснить задачу.
Прикладываю в архиве образец исходного файла и выходных файлов.
имена выходных файлов значения не имеют (можно просто цифрами).
в первом выходном файле — 1 и 2;
во втором — 1 и 3;
в третьем — 2;
в четвёртом — 4;
в пятом — опять 4.
Принцип разделения не понятен (и не соответствует описанию из сообщения #3).
Принцип деления такой:
в 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
Принцип деления такой: »
И как Вы будете отличать файл 4.txt от 5.txt? По какому принципу?
Логичнее выводить в файл заголовок секции и только саму строку с ошибкой, а не всю секцию целиком...
Но однако, тут слишком всё неоднозначно. Сколько (максимально) типов ошибок может вообще присутствовать в файле?
Rey71,
не лучше ли это все было делать в excel, например, с отдельным столбцом ошибки с выходом на примечание или гиперссылку или список на разновидность, да впрочем там есть где разгуляться по части сортировки и вывода. Или какая-то программа так (в txt) выводит и ничего не поделать уже. Вы понимаете что это целая база уже, а не мелкий сбор пунктов в файле.
megaloman
22-01-2019, 17:54
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, что будет, если во входном файле попадутся угловые скобки?
megaloman
23-01-2019, 00:30
Busla, что будет, если во входном файле попадутся угловые скобки? »Думаю, много чего может попасться, чтобы батник сломался. Надо быть уверенным в допустимом наборе символов (Rey71, увы, дал очень мало инфы и потребовал CMD), или надо делать на чём-то другом. Например, vbs.
156145
странные как для меня решения предлагаются, я как-то так представлял себе задачу:
@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
Медицинское учреждение. Ежемесячно формируется отчет в фонд обязательного медицинского страхования.
Перед отправкой отчета программа ФОМС проверяет отчет на наличие ошибок и формирует текстовый файл. (прикладываю образец файла с первыми двумя пациентами и ошибками по ним)
в файле первая строка начинается с символа # и содержит информацию о пациенте, проводимом лечении и т.д.
следующие строки каждая содержит ошибку которую необходимо исправить и так до строки начинающейся со знака #.
Необходимо разделить этот файл на несколько файлов которые будут группироваться по ошибкам чтобы раздать мед персоналу для исправления ошибок.
причем необходимо учесть следующее:
Строка с ошибкой может быть как одинаковой целиком, например "У новорожденного не указан вес (не заполнено поле Weight)"
так и совпадающей только частью строки, например "Значения полей KPG и KSG не соответствуют справочнику KSG.DBF в отчетном периоде : KPG= 16, KSG=110"
где значения "KPG= 16, KSG=110" могут меняться в разных строках ошибок.
как вариант можно создать файл с образцами основных ошибок и группировать по ним а если встретятся ошибки не существующие в файле образца ошибок то их собрать в отдельный файл.
как вариант можно создать файл с образцами основных ошибок »
Не «как вариант», а только так, ибо иначе кто будет определять:
Строка с ошибкой может быть как одинаковой целиком… так и совпадающей только частью строки, »
что где?!
Оптимальный вариант, как я вижу — собирать виды ошибок сразу в виде регулярных выражений, для WSH или PoSH.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.