разбить текстовый файл на несколько по условию
Прошу помочь
Имеется текстовый файл следующего типа # 1 Текст1 Ошибка1 текст Ошибка2 текст Ошибка3 текст # 2 Текст2 Ошибка1 текст Ошибка2 текст Ошибка4 текст # 3 Текст3 Ошибка2 текст Ошибка4 текст Ошибка5 текст необходимо разделить на несколько текстовых файлов по следующему условию: если в части текста которая начинается с символа # и до следующей # встречается фраза "Ошибка1" то всю эту часть текста скопировать в файл 1.txt и т.д. |
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 текст и т.д. |
Цитата:
Нужен сам принцип построения вашего документа. Цитата:
|
Цитата:
|
Пример исходного файла
# 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 это У aaaaaaaaaaaaaa не указан sss
А текст в скобках? |
Цитата:
Как будет строка идентифицироваться, чтобы было однозначное соответствие определенному выходному файлу? Т.е., например, вот тут есть соответствие: Код:
Ошибка1 -> 1.txt Нет соответствия
Цитата:
и вот здесь: его тоже нет
Цитата:
Как отбирать строки, чтобы они попали в тот файл, в который требуется? |
Rey71, возьмите Ваш исходный файл. Произвольно обфусцируйте в нём персональные данные. Сделайте из него «ручками» потребные текстовые файлы с потребными именами. Упакуйте всё это в архив, каковой приложите к сообщению.
|
Вложений: 1
Прошу прощения, не смог правильно объяснить задачу.
Прикладываю в архиве образец исходного файла и выходных файлов. имена выходных файлов значения не имеют (можно просто цифрами). |
|
Принцип деления такой:
в 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 |
Цитата:
Логичнее выводить в файл заголовок секции и только саму строку с ошибкой, а не всю секцию целиком... Но однако, тут слишком всё неоднозначно. Сколько (максимально) типов ошибок может вообще присутствовать в файле? |
Rey71,
не лучше ли это все было делать в excel, например, с отдельным столбцом ошибки с выходом на примечание или гиперссылку или список на разновидность, да впрочем там есть где разгуляться по части сортировки и вывода. Или какая-то программа так (в txt) выводит и ничего не поделать уже. Вы понимаете что это целая база уже, а не мелкий сбор пунктов в файле. |
Rey71, Не знаю, зачем это надо. ИМХО, хотелось бы знать конечную цель. Если для анализа, то надо как-то сформулировать, что анализируется.
Сложновато, но попробуйте
Код:
@Echo Off |
megaloman, что будет, если во входном файле попадутся угловые скобки?
|
Busla,
Цитата:
|
Файл 156145
странные как для меня решения предлагаются, я как-то так представлял себе задачу: Код:
@echo off |
Вложений: 1
Медицинское учреждение. Ежемесячно формируется отчет в фонд обязательного медицинского страхования.
Перед отправкой отчета программа ФОМС проверяет отчет на наличие ошибок и формирует текстовый файл. (прикладываю образец файла с первыми двумя пациентами и ошибками по ним) в файле первая строка начинается с символа # и содержит информацию о пациенте, проводимом лечении и т.д. следующие строки каждая содержит ошибку которую необходимо исправить и так до строки начинающейся со знака #. Необходимо разделить этот файл на несколько файлов которые будут группироваться по ошибкам чтобы раздать мед персоналу для исправления ошибок. причем необходимо учесть следующее: Строка с ошибкой может быть как одинаковой целиком, например "У новорожденного не указан вес (не заполнено поле Weight)" так и совпадающей только частью строки, например "Значения полей KPG и KSG не соответствуют справочнику KSG.DBF в отчетном периоде : KPG= 16, KSG=110" где значения "KPG= 16, KSG=110" могут меняться в разных строках ошибок. как вариант можно создать файл с образцами основных ошибок и группировать по ним а если встретятся ошибки не существующие в файле образца ошибок то их собрать в отдельный файл. |
Цитата:
Цитата:
Оптимальный вариант, как я вижу — собирать виды ошибок сразу в виде регулярных выражений, для WSH или PoSH. |
Цитата:
Цитата:
В каждый отдельный файл, должны быть выведены только конкретные по типу ошибки, т.е. в каждом файле свои ошибки, привязанные к конкретному пациенту? Ну, нет смысла выводить в каждый файл весь список ошибок, если уж их требуется разделить. Иначе, проще разбить файл на определенное число пациентов, затем вывести их в файлы с полным содержимым ошибок по каждому пациенту... Цитата:
|
Как подсознательно чувствовал, кодировка файла 1251. Долой CMD.
ИМХО, в программе ФОМХ (совершенно с ней не знаком) заполняются некие поля. Цитата:
Цитата:
Цитата:
формируем таблицу Excel по шаблону. В первом столбце шаблона -заголовок секции (то, что начинается с #) Во втором - ошибка без указания опознанного в строке сообщения поля - наверное, возможно и такое? Как, в принципе: когда имя поля в сообщении отсутствует, так и как упущении при создании Excel-шаблона: айтишник в атаку - дополняй шаблон, если надо. В последующих - имена всех заполняемых полей. Сюда будут попадать сообщения, в котором помянуто поле в заголовке. После импорта текстового файла в таблицу, созданную по шаблону, удаляем (скрываем?) столбцы, в которые ничего не попало, для лучшей читаемости. Похоже, разный медперсонал отвечает за заполнение разных полей. Флаг в руки! В фильтре таблицы каждый может указать отбор по своим непустым полям. Вуаля! ИМХО, довольно объёмная работа и для тестирования понадобится реальный файл. Обычно я пытаюсь смотреть на инфу глазами конечного пользователя. Что он получает сейчас и что его в этом не устраивает? Сформулируйте, приведите примеры, прежде чем пытаться что-то делать, тыкая пальцем в небо. Можно пойти по пути Iska, но немного не так. Без Excel, например, в VBS, сформировать массив со списком полей в виде строки с разделителем для каждого пользователя и формировать столько файлов с копиями секций исходного файла, сколько элементов в этом массиве. Это более простое решение. |
Теперь это уже немножко офтопик - мне было интересно решить задачу в первоначальной формулировке на powershell:
Код:
$errors = @{} |
Ну тогда и я на powershell со своей идефикс, что выводить все ошибки по каждому пациенту в разные файлы иррационально.
Принцип: для каждой ошибки свой файл, если есть ошибка с привязкой к пациенту, то выводим такую ошибку в определенный для неё файл: Код:
$fle = 'obraz.txt' |
Rey71,
VBS. Немного оффтоп, считаю, что ошибка занимает всю строку целиком. Для удобства вывел ошибку в заголовок сформированного файла.
Отельным файлом с номером 0000 выдал список ошибок и номера файла, где они фигурируют Код:
FileIn = "Z:\Box_In\Errors\исходный файл.TXT" |
Всем огромное спасибо.
Понял что с наскока решить не получится. Буду думать над правильной постановкой задачи. |
Цитата:
Что в конечном итоге требуется получить? Особенно, желательно описать подробнее это: Цитата:
то бишь: 1. Один файл - один тип ошибки, но по разным пациентам, у которых этот тип ошибки присутствует. 2. Один файл - несколько (сколько именно?) пациентов, причем со всеми ошибками по каждому, отобранному пациенту. 3. ... ? Третьего варианта, лично я не вижу, т.к. при нахождении одного типа ошибки по одному пациенту, выводить все ошибки привязанные к этому пациенту в отдельный файл - не имеет смысл, т.к. не будет никакой упорядоченности, да и собственно, вообще никакого алгоритма отбора информации для вывода в разные файлы, в этом случае тоже не будет. |
Надо вычислять какой-то идентификатор строки ошибки. Например, удалить весь известный динамический контент в строке ошибки, (или всё, кроме кириллицы), привести к одному регистру, вычислить md5 от того, что осталось. Это будет ключ для группировки по ошибке (по файлам, или поле в БД).
|
Sham, если понимать, что такое хэш-таблица, или представлять как устроены БД, то становится очевидным, что все эти велосипеды изобретены и реализованы до вас
|
Время: 08:26. |
Время: 08:26.
© OSzone.net 2001-