0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
|
|
1 | |
Отбор конкретных данных из текстовых файлов (.txt)17.08.2015, 12:00. Показов 1486. Ответов 15
Метки нет (Все метки)
Приветствую!
Пишу программу, которая позволяла бы брать необходимые данные из текстовых файлов, а именно формата .txt. Но проблема в том, что в этих файлах нужные данные находятся в разных местах. Как можно взять необходимые данные и сохранить в другом файле? Пример содержимого текстовых файлов (Во вложении более развёрнуто): Код
4115111111. Cчёт: 100000000000, организация: ООО Дата Вызыв-мый Абн. Заказ Усл. Длит. Сумма дд мм гг чч мм -------------- -------------------------------------------------------------- -------- -------- - ОСНОВНОЙ ТЕЛЕФОН - 415.00 - ПРЕДОСТАВЛ. МЕСТНОГО ТЕЛЕФ. СОЕДИНЕНИЯ (БЕЗЛИМИТНЫЙ) - 570.00 - ПРЕДОСТАВЛЕНИЕ ДЕТАЛИЗИРОВАННОЙ ИНФОРМАЦИИ ОБ ОКАЗАННЫХ УСЛУ - 70.50 Телефон: 4115111111, кол-во услуг: 3, сумма: 1055.50 ---------- -------- Cчёт: 100000000000, организация: ООО Дата Вызыв-мый Абн. Заказ Усл. Длит. Сумма дд мм гг чч мм -------------- -------------------------------------------------------------- -------- -------- - IP-11.11.111.11 ВНШ 15000. 0.00 - IP-11.11.111.11 ВНШ 2063.1 4016.89 - IP-11.11.111.11 ЗОН 420.6 297.78 - ПЕРЕРАСЧЕТ ОСНОВНОЙ ТЕЛЕФОН - -26.77 - ПЕРЕРАСЧЕТ ПРЕДОСТАВЛ. МЕСТНОГО ТЕЛЕФ. СОЕДИНЕНИЯ (КОМБИНИРО - -18.71 Номер, Дата, Вызыв-мый Абн., Заказ Усл., Длит., Сумма Сами текстовые файлы очень большие и содержат много таких данных. Я хочу сделать что-то вроде поиска по этим файлам, чтобы если найдет номер, то сохранять в виде "Номер,Дата,Вызыв-мый Абн.,Заказ Усл.,Длит.,Сумма", а если не найдет номер, значит нужно оставлять первые три столбца пустыми и брать с IP. А лучше было бы, если сможет брать определенное количество символов из каждого столбца. Для столбца "Номер" используется 10 символов, "Дата" - 14, "Вызыв-мый Абн." - 10, "Заказ Усл." - 60, "Длит." - 6, "Сумма" - 8. Также примерно подсчитал с какого символа начинается каждый столбец: "Дата" - 1-14, "Вызыв-мый Абн." - 15-29, "Заказ Усл." - 32-92, "Длит." - 93-99, "Сумма" - 102-110. Просто не могу разобраться с чего начать, какие компоненты и процедуры использовать... Программу вижу примерно так: Необходимо выбрать файл, преобразавать в вид "Номер,Дата,Вызыв-мый Абн.,Заказ Усл.,Длит.,Сумма" и сохранить его как отдельный файл. Memo использую для наглядности. пример.txt
0
|
17.08.2015, 12:00 | |
Ответы с готовыми решениями:
15
Отбор имен файлов .txt в общий список Просмотр текстовых файлов формата *.rtf, *.doc, *.txt Создать 150 текстовых файлов с именами "fileN.txt" Создать 150 текстовых файлов с именами "fileN.txt" |
Sfairath
|
17.08.2015, 12:51
#2
|
Не по теме: Прямо аж самому интересно стало.
0
|
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
|
|
17.08.2015, 16:25 | 3 |
грузить в TStringList например. Парсить - Pos, PosEx
или обращаться к конкретной строке файла, например с номером счета, если счет тот который нужен, то парсить данные из следующих n строк, если счет не тот то проверять следующую строку со счетом... Но это только "одно из", вариантов много разных как можно сделать
0
|
20 / 20 / 7
Регистрация: 08.07.2015
Сообщений: 176
|
|
17.08.2015, 16:34 | 4 |
Да тут тупо мучать парсинг этого документа. Других вариантов не дано. А мучать его долго и не очень счастливо придется...
0
|
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
|
|
18.08.2015, 08:19 [ТС] | 5 |
Переосмыслил поставленную задачу и пришел к выводу, что лучше будет сделать в следующем виде:
1. Сперва нужно открыть файл с помощью OpenDialog; 2. Отобразить полученные данные в Memo; 3. С помощью кнопки "Найти номера" надо извлечь данные из Memo и преобразовать в такой формат: Номер|Дата|Вызыв-мый Абн.|Заказ Усл.|Длит.|Сумма Но можно и в другой формат, так как номер повторяется 1 раз, а остальные данные могут продолжаться: Номер Дата|Вызыв-мый Абн.|Заказ Усл.|Длит.|Сумма В текстовом файле перед началом номера идут знаки тире (-) в виде 8 шт. без пробелов в начале и в конце. На следующей строке Номер содержит обычно 10 символов, но встречается и 14 символов. Номер всегда начинается с цифры (4) и заканчивается точкой (.). После точки идут не нужные данные. Следующие две строки тоже не нужны. На следующей строке берем Дату (1-14 символы), затем Вызыв-мый Абн. (15-29), Заказ Усл. (32-92), Длит. (93-101), Сумма (102-110). При этом в дате, вызыв. абон., длит. могут содержаться пустые пробелы, либо тире (-). Данные идут до строки " Телефон:", которую не надо брать. Заканчиваются данные о номера на следующей строке 10 или 14 тире (-) в зависимости от длины номера. В каждом файле много номеров. 4. По идее после пункта 3 надо сохранить полученные данные по номерам из Memo в отдельный файл и выбрать файл заново для формирования IP. С помощью кнопки "Найти IP" надо извлечь данные из Memo и преобразовать в такой формат: Вызыв-мый Абн.|Заказ Усл.|Длит.|Сумма Тут по идее легче должно быть, т. к. всего один раз формируется данные для IP. Также сперва идут 8 тире (-), на след. строке " Счёт:" (с пробелом в начале). Эта строка и нижние две не нужны. Данные нужны сразу из Заказ Усл. (32-92), Длит. (93-101), Сумма (102-110), т. к. Дата содержит пустые пробелы, а Вызыв-мый Абн. содержит тире (-). После данных идет пустая строка и на следующей строке 8 тире (-).
0
|
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
|
|||||||||||
18.08.2015, 12:54 | 6 | ||||||||||
открыть файл
1
|
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
|
|
19.08.2015, 03:35 [ТС] | 7 |
Долгое время никто не отвечал, решил удалить тему и переформулировать свой вопрос и поставить пока более лёгкую задачу, чтобы с чего можно было начать. Спасибо за ответ, но мне нужно сделать не поиск по файлу, а в этом текстовом файле отсеять лишнюю информацию и оставить только данные в таком виде: "Номер|Дата|Вызыв-мый Абн.|Заказ Усл.|Длит.|Сумма" и "Заказ Усл.|Длит.|Сумма"
0
|
19.08.2015, 04:56 | 8 |
Определяемся с типами строк - у каждой свой фиксированный формат. Дальше элементарно: считываем строку и выясняем, к какому из N форматов она относится (по набору признаков - ex.: начинается с числа, с пробела, с буквы, в какой колонке слово "сумма" и с прописной или строчной итд). Парсим строку по N-му шаблону.
1
|
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
|
|
19.08.2015, 04:59 [ТС] | 9 |
Можно пример кода? Желательно с моими данными.
0
|
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
|
|
19.08.2015, 05:14 [ТС] | 11 |
0
|
19.08.2015, 05:18 | 12 |
Собственно, и без примера должно быть понятно: для приведенного вами текста, получается 11 вариантов шаблона:
Код
- IP-11.11.11.11 ВНШ 18982. 0.00 - АБОНЕНТСКАЯ ПЛАТА ЗА ПОРТ DSL (СТАРТАП БЕЗЛИМИТ 512 РЕГИОН I 1.0 20000.00 ---------- Дата Вызыв-мый Абн. Заказ Усл. Длит. Сумма Телефон: 4115111111, кол-во услуг: 1, сумма: 7.20 -------- 15/06/25 14:15 9999999999 МОСКВА МОБИЛЬНЫЙ 2.0 17.40 4115111111. Cчёт: 100000000000, организация: OOO АОН Сумма: 2124.00 (Вкл-я НДС: 324.00) ПОСТАВЩИК УСЛУГ: ПАО "Ростелеком" Кол-во услуг: 4808 Сумма: 474774.52 (Вкл-я Н.Д.С.: 72423.22) дд мм гг чч мм -------------- -------------------------------------------------------------- -------- -------- Формат определяете по первому символу + ключевое слово в определенной колонке ("IP", "Дата" etc.)
1
|
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
|
|
19.08.2015, 05:32 [ТС] | 13 |
Точно! Спасибо за идею!
Правда у меня не 11 вариантов, а немного больше вариантов получится, т. к. несколько файлов и там могут быть ещё данные, но думаю стоит попробовать
0
|
19.08.2015, 05:36 | 14 |
Склейте все тексты в один, отсортируйте в текстовом редакторе - сразу станут видны строки с тождественным форматом. Остается написать собственную "виртуальную функцию" парсера :-)
1
|
Puporev
|
||||||
19.08.2015, 08:42
#15
|
||||||
0
|
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
|
|
19.08.2015, 11:29 [ТС] | 16 |
Всё не то. Мне надо зацепиться за слово "Счёт", это слово встречается во всех нужных данных. Например:
1. Если найдет слово "Счёт", то должен проверить что находится левее (или с какого символа начинается. если с 13-го символа, то копировать 10 цифр, если с 17 символа, то копировать 14 цифр), если есть пробел, точка и цифры (цифр может быть 10 или 14), значит это данные номеров. Копируем с цифры 4 (всегда начинается с цифры 4) до точки и добавить разделитель "|". Отступаем с этой строки и нижние две строки тоже отступаем. Потом берем Дату (символы 1-14) добавляем разделитель "|", затем Вызыв-мый Абн. (15-29) добавляем разделитель "|", Заказ Усл. (32-92) добавляем разделитель "|", Длит. (93-101) добавляем разделитель "|", Сумма (102-110). Все такие строки копировать до слово " Телефон" (с двумя пробелами), эта строка тоже не нужна. Номер, который встречается возле "Счёта" нужно добавить перед каждыми данными, чтобы было в таком формате: Номер|Дата|Вызыв-мый Абн.|Заказ Усл.|Длит.|Сумма 2. Если только один пробел (или же начинается со второго символа), значит это данные IP. Надо пропустить эту строку, а также две нижних строки и брать данные в следующем формате: Заказ Усл. (начинается с символа 32 заканчивается 92. Только до 60 символов) добавить разделитель "|", Длит. (93-101) добавить разделитель "|", Сумма (102-110). И так брать данные пока не будет пустой строки (там скорее всего нет символов, просто отступ) и на следующей строке 8 тире (--------). После этого, отобразить данные в Memo.
0
|
19.08.2015, 11:29 | |
19.08.2015, 11:29 | |
Помогаю со студенческими работами здесь
16
Анализ данных из текстовых файлов Чтение данных из текстовых файлов Чтение конкретных строк из txt (2 - 5) Перенос данных из текстовых файлов в excel Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |