Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
1

Отбор конкретных данных из текстовых файлов (.txt)

17.08.2015, 12:00. Показов 1486. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!

Пишу программу, которая позволяла бы брать необходимые данные из текстовых файлов, а именно формата .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
Отбор конкретных данных из текстовых файлов (.txt)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2015, 12:00
Ответы с готовыми решениями:

Отбор имен файлов .txt в общий список
Форумчане, доброго времени суток! Прошу вашей помощи. Есть папка "1" с файлами .txt Нужно...

Просмотр текстовых файлов формата *.rtf, *.doc, *.txt
В общем открыть для просмотра текстовые файлы формата *.rtf, *.doc, *.txt без показа включенных в...

Создать 150 текстовых файлов с именами "fileN.txt"
2. Создайте 150 текстовых файлов с именами "fileN.txt" (N=1-150). Запишите в файлы текст следующего...

Создать 150 текстовых файлов с именами "fileN.txt"
3. Создайте 150 текстовых файлов с именами «fileN.txt» (N = 1-150). Запишите в файлы текст...

15
Sfairath
17.08.2015, 12:51
  #2

Не по теме:

Прямо аж самому интересно стало.

0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
17.08.2015, 16:25 3
Цитата Сообщение от Saimon Посмотреть сообщение
какие компоненты и процедуры использовать...
грузить в 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 тире (-).
Миниатюры
Отбор конкретных данных из текстовых файлов (.txt)  
Вложения
Тип файла: txt пример.txt (8.4 Кб, 6 просмотров)
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
18.08.2015, 12:54 6
Цитата Сообщение от Saimon Посмотреть сообщение
1. Сперва нужно открыть файл с помощью OpenDialog;
2. Отобразить полученные данные в Memo;
3. С помощью кнопки "Найти номера" надо извлечь данные из Memo и преобразовать в такой формат:
открыть файл
Delphi
1
2
3
4
  if OpenDialog1.Execute then
  begin
    Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
  end;
кнопки Найти
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
  i: Integer;
  Find: string;
begin
 Find := Edit1.Text;
  for i := 0 to Memo1.Lines.Count do
  begin
    if Pos(Find, Memo1.Lines[i]) <> 0 then
    begin
      Memo1.SetFocus();
      Memo1.SelStart := Pos(Find, Memo1.Lines.Text) - 1;
      Memo1.SelLength := Length(Find);
      Application.MessageBox('Строка наидено', 'Поиск закончен', MB_OKCANCEL);
      break;
    end
  end;
Ваши тема увидел на другом форуме , пока ответил его удалили непонятно почему
Миниатюры
Отбор конкретных данных из текстовых файлов (.txt)  
Вложения
Тип файла: rar Memo_Search_text.rar (332.0 Кб, 4 просмотров)
1
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
19.08.2015, 03:35  [ТС] 7
Долгое время никто не отвечал, решил удалить тему и переформулировать свой вопрос и поставить пока более лёгкую задачу, чтобы с чего можно было начать. Спасибо за ответ, но мне нужно сделать не поиск по файлу, а в этом текстовом файле отсеять лишнюю информацию и оставить только данные в таком виде: "Номер|Дата|Вызыв-мый Абн.|Заказ Усл.|Длит.|Сумма" и "Заказ Усл.|Длит.|Сумма"
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
19.08.2015, 04:56 8
Определяемся с типами строк - у каждой свой фиксированный формат. Дальше элементарно: считываем строку и выясняем, к какому из N форматов она относится (по набору признаков - ex.: начинается с числа, с пробела, с буквы, в какой колонке слово "сумма" и с прописной или строчной итд). Парсим строку по N-му шаблону.
1
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
19.08.2015, 04:59  [ТС] 9
Можно пример кода? Желательно с моими данными.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
19.08.2015, 05:06 10
Цитата Сообщение от Saimon Посмотреть сообщение
Можно пример кода?
Если устроит на C (на Delphi не пишу).
1
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
19.08.2015, 05:14  [ТС] 11
Цитата Сообщение от gazlan Посмотреть сообщение
Если устроит на C (на Delphi не пишу).
Спасибо за предложение, в С в принципе разбираюсь, но я пока работаю с Delphi
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
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)
дд мм гг чч мм -------------- -------------------------------------------------------------- -------- --------
Пишете простенькую функцию GetFormatIndex(const char* const pszLine), и парсите строку в соответствии с полученным индексом формата.

Формат определяете по первому символу + ключевое слово в определенной колонке ("IP", "Дата" etc.)
1
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 7
19.08.2015, 05:32  [ТС] 13
Точно! Спасибо за идею!

Правда у меня не 11 вариантов, а немного больше вариантов получится, т. к. несколько файлов и там могут быть ещё данные, но думаю стоит попробовать
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
19.08.2015, 05:36 14
Цитата Сообщение от Saimon Посмотреть сообщение
немного больше вариантов получится
Склейте все тексты в один, отсортируйте в текстовом редакторе - сразу станут видны строки с тождественным форматом. Остается написать собственную "виртуальную функцию" парсера :-)
1
Puporev
19.08.2015, 08:42
  #15
 Комментарий модератора 
Saimon, Прекратите постоянно цитировать предыдущие сообщения целиком и без всякой надобности.
Вы нарушаете пункт Правил 5.17
В следующий раз накажу.
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2015, 11:29
Помогаю со студенческими работами здесь

Анализ данных из текстовых файлов
Добрый вечер! У меня есть три .txt файла, каждый из которых представляет собой столбец с 5000...

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

Чтение конкретных строк из txt (2 - 5)
Подкиньте, пожалуйста, пример (на VB) чтения, например, со 2 строки txt файла по пятую. Или...

Перенос данных из текстовых файлов в excel
Доброго всем дня! Помогите, пожалуйста с решением проблемы! Есть множество txt файлов, нужно при...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru