С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

Поиск даты в txt файле

02.11.2014, 14:01. Показов 1576. Ответов 13

Студворк — интернет-сервис помощи студентам
Добро всем!
У меня в txt хранятся данные вот в таком виде:
30.10.2014
Адрес: Автобусный 14 п.2, кв. 15
Телефон: 547896
Тип заявки: Кнопка снятия
31.10.2014
Адрес: 29ВГородок 17 п.2, кв. 7
Телефон: 554477
Тип заявки: Выберете характер заявки
01.11.2014
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки


Задача стоит дописать в файл текущую дату, что я делаю
так:
C++
1
2
3
4
5
6
7
8
9
10
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm21 *Form21;
TStringList *zay=new TStringList;
........
........
void __fastcall TForm21::FormShow(TObject *Sender)
{
zay->Add(DateToStr(Date()));
}
Проблема в том чтобы осуществить проверку а не записана ли уже текущая дата, вот таким циклом я могу проверить наличие такой записи.
C++
1
2
3
4
5
for(int i = 0; i < zay->Count; i++) {
  if (zay->Strings[i].Pos(DateToStr(Date()))) {
  ShowMessage("Нашлась!");
  break; }
}
Вопрос:
как по завершению вывести сообщение об отсутствии строки с текущей датой в txt файле?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2014, 14:01
Ответы с готовыми решениями:

Поиск строки в файле(txt).
Имеется test.txt файл. Внутри файл имеет следующую структуру: ... 0,0,&quot;TMNT.jpg&quot; ...

Поиск в .txt файле без учёта регистра букв
Доброго времени суток! Подскажите, пожалуйста, как реализовать поиск фразы, записаной в edit, в текстовом документе без учёта регистра...

Поиск по символам в txt файле и вывод результатов в StringGrid
Добрый день уважаемые программисты и не.:) В работе над базой данных жильцов столкнулся с двумя проблемами при осуществлении поиска: 1....

13
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.11.2014, 14:16
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Ну, флажком помахать можно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool date_found( false );
for( int i = 0; i < zay->Count; i++ ) {
    if ( zay->Strings[i].Pos( DateToStr( Date( ) ) ) ) {
        date_found = true;
        break; 
    }
}
if( date_found )
{
    ShowMessage( "Нашлась!" );
}
else
{
    ShowMessage( "Не нашлась!" );
}
Добавлено через 5 минут
При такой записи даты отдельной строчкой, кстати, лучше использовать метод IndexOf:
C++
1
2
3
4
5
6
7
8
if( zay->IndexOf( DateToStr( Date( ) ) ) != -1 )
{
    ShowMessage( "Нашлась!" );
}
else
{
    ShowMessage( "Не нашлась!" );
}
2
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
02.11.2014, 14:31  [ТС]
Решено! Спасибо!
Еще пару вопросов с вашего позволения.
Как выдернуть из файла искомую дату и все что следует за ней вплоть до следующей даты?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.11.2014, 14:50
Регуляркой найти следующую дату. Но это, как бы, избыточно и, возможно, чревато ошибками - не знаю, что там еще может быть позаписано в файле. Лучше к строчке даты лепить маркер, однозначно указывающий, что в этой строке начало следующей записи, или что в этой строке именно дата. Так же, как у тебя сейчас адрес, телефон. Тогда достаточно будет найти этот маркер в одной из следующих строк.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
02.11.2014, 15:07  [ТС]
В файле соблюдается строгая дисциплина, все записывается программно.
Я добавил к дате приставку "Дата: " в итоге файл выглядит так:

Дата: 01.11.2014
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
Дата: 02.11.2014
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
Дата: 03.11.2014
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки


Вопрос в том как выдернуть нужную часть например за 02.11.2014 вот в таком виде:

Дата: 02.11.2014
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
Адрес: Выберете адрес, кв.
Телефон:
Тип заявки: Выберете характер заявки
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.11.2014, 15:34
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    TStrings * lines_in( mem_input->Lines ), * lines_out( mem_output->Lines );
    int i( lines_in->IndexOf( "Дата: " + edit_date->Text ) );
 
    if ( i != -1 )
    {
        lines_out->Add( lines_in->Strings[ i++ ] );
        for ( int i_limit( lines_in->Count ); i < i_limit; ++i )
        {
            if ( lines_in->Strings[ i ].Pos( "Дата" ) )
            {
                break;
            }
            lines_out->Add( lines_in->Strings[ i ] );
        }
    }
Миниатюры
Поиск даты в txt файле  
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
02.11.2014, 16:46  [ТС]
Идеальный вариант! Спасибо!
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
03.11.2014, 21:55  [ТС]
Добро всем!
У меня в txt файле все сохранено так:
Дата: 02.11.2014
Адрес: Московская 33 п.1 кв: 10
Телефон: 554466
Тип заявки: Замена
Адрес: АКесаева 37 п.1, кв: 5
Телефон: 525655
Тип заявки: Установка
Дата: 03.11.2014
Адрес: Нагорная 4А п.1 кв:
Телефон: 545658
Тип заявки: Замена
Адрес: Московская 33 п.1 кв: 5
Телефон: 554466
Тип заявки: Ремонт

По параметру Дата находит и выводит в Мемо1 корректно!
А как вывести в Мемо1 все данные по параметру Адрес ?
Например ищем все заявки с адреса Московская 33 п.1

Чтоб результат поиска в Мемо1 выглядел так:
Дата: 02.11.2014
Московская 33 п.1 кв: 10
Телефон: 554466
Тип заявки: Замена
Дата: 03.11.2014
Московская 33 п.1 кв: 5
Телефон: 554466
Тип заявки: Ремонт
0
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
04.11.2014, 12:22
Может немножко изменить формат сохранения данных? Например так, в одну строку, разделяя типы знаком #, этим вы создадите формат одна строка - одна запись
Code
1
Дата: 02.11.2014#Московская 33 п.1 кв: 10#Телефон: 554466#Тип заявки: Замена
При условии что текстовый файл уже загружен в список

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
   TStringList *lGeneral = new TStringList(); // Сюда загружается ваш файл с данными
   TStringList *lTokenData = new TStringList(); // Сюда разбивается строка, образуя временный список из 4 строк
 
   TSysCharSet chLaticce;
   chLaticce << '#'; // Разделитель строк, по которому будем бить - #
 
   for(int i = 0; i < lGeneral->Count; i++){
      lTokenData->Clear();
      ExtractStrings(chLaticce, chLaticce, lGeneral.c_str(), lTokenData); //Функция разбивки строки. Теперь список lTokenData содержит 4 строки: Дата, Адрес, Телефон, Тип заявки
      Memo1->Lines->Add(lTokenData->Strings[0]); // Вывод даты
      Memo1->Lines->Add(lTokenData->Strings[1]); // Вывод адреса
      Memo1->Lines->Add(lTokenData->Strings[2]); // Вывод телефона
      Memo1->Lines->Add(lTokenData->Strings[3]); // Вывод типа заявки
      Memo1->Lines->Add(""); // Пустая строка, для визуальности
     }
...
Записать данные в одну строку можно наверное так
C++
1
2
3
4
5
6
7
8
9
10
11
...
   UnicodeString strDataFile = ""; // Результирующая строка
   UnicodeString strDate = "Дата: 02.11.2014";
   UnicodeString strAddress = "#" + "Московская 33 п.1 кв: 10";
   UnicodeString strTelefon = "#" + "Телефон: 554466";
   UnicodeString strType = "#" + "Тип заявки: Замена";
 
   strDataFile = strDate + strAddress + strTelefon + strType; // Формируем одну строку
 
   // Оперируем дальше с strDataFile
...
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
04.11.2014, 13:11  [ТС]
Цитата Сообщение от Maestro Посмотреть сообщение
'#'; // Разделитель строк, по которому будем бить - #
а нельзя вместо '#' бить по записи 'Адрес:' и если он совпадет с искомым мы добавляем в стриг все что следует за ним до следующей записи Адрес: ?

я немного ошибся в описании файла тхт, данные уже существуют и записаны так:
Дата: 02.11.2014
Адрес: Московская 33 п.1 кв: 10
Телефон: 554466
Тип заявки: Замена
Адрес: АКесаева 37 п.1, кв: 5
Телефон: 525655
Тип заявки: Установка
Дата: 03.11.2014
Адрес: Нагорная 4А п.1 кв:
Телефон: 545658
Тип заявки: Замена
Адрес: Московская 33 п.1 кв: 5
Телефон: 554466
Тип заявки: Ремонт

Добавлено через 34 минуты
да и все остальное работает и не хотелось бы переписывать по новой...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
04.11.2014, 13:46
Ну, допустим, вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// #include <memory>
// #include <StrUtils.hpp>
 
    std::auto_ptr<TStringList> L(new TStringList);
    L->LoadFromFile("D:\\test\\thread1290222.txt");
    TStringDynArray arr(SplitString(StringReplace(L->Text, L"Адрес:",
        L"#Адрес:", TReplaceFlags() << rfReplaceAll), "#"));
    for (int i = 0; i < arr.Length; i++)
    {
        if (arr[i].Pos(Edit1->Text) > 0)
        {
            Memo1->Lines->Add(arr[i]);
        }
    }
, и как ты теперь будешь определять дату события? А была бы дата записана перед каждым событием - просто разбил бы не по "Адрес", а по "Дата", и не было бы проблем...
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
04.11.2014, 14:02  [ТС]
В Edit1 пишу искомый адрес и он его находит и выводит в Мемо1:
C++
1
2
3
4
5
for(int i = 0; i < list->Count; i++)
  {
  if (list->Strings[i].Pos(Edit1->Text))
   Memo1->Lines->Append(list->Strings[i]);
  }
из этого нельзя попробовать сделать то что мне требуется?
0
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
04.11.2014, 15:32
Цитата Сообщение от Samrisbe Посмотреть сообщение
а нельзя вместо '#' бить по записи 'Адрес:' и если он совпадет с искомым мы добавляем в стриг все что следует за ним до следующей записи Адрес: ?
Нельзя к сожалению, там одиночный символ только.
Цитата Сообщение от Samrisbe Посмотреть сообщение
да и все остальное работает и не хотелось бы переписывать по новой...
Так переписывая вы оптимизируете и закладываете потенциал для расширения функционала, допустим, вот UI, вам понадобится внести данные о дате обращения, дополнительных данных. К тому же, переписав лишь малую часть: сохранение в новом формате и считывание, саму базу можно подправить стандартными средствами добавив # перед значениями. Но это моё мнение, я бы так сделал. Я не вижу мегасложностей в том чтобы в обработчик сохранения в базу написать новый формат, а считывание\поиск уже написал выше.
Цитата Сообщение от Samrisbe Посмотреть сообщение
из этого нельзя попробовать сделать то что мне требуется?
Pos найдёт только первое вхождение, а если учитывать что пользователь обращался дважды\трижды в сервис и записей у него несколько? Какую выведет Pos, самую первую найденую.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.11.2014, 18:20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    TStrings * lines_in( memo_input->Lines ), * lines_out( memo_output->Lines );
 
    for ( int i( 0 ), date_idx, i_limit( lines_in->Count ); i < i_limit; ++i )
    {
        if ( lines_in->Strings[ i ].Pos( "Адрес: " + edit_target->Text ) == 1 )
        {
            date_idx = i;
            do
            {
                --date_idx;
            }
            while ( lines_in->Strings[ date_idx ].Pos( "Дата:" ) != 1 );
 
            lines_out->Add( lines_in->Strings[ date_idx ] );
            lines_out->Add( lines_in->Strings[ i++ ] );
 
            while ( lines_in->Strings[ i ].Pos( "Дата:" ) != 1 &&
                lines_in->Strings[ i ].Pos( "Адрес:" ) != 1 &&
                i < i_limit )
            {
                lines_out->Add( lines_in->Strings[ i++ ] );
            }
        }
    }
Решение в лоб...

Samrisbe, только лучше уж избегать таких решений, правильно тут все говорят. Надо четче структурировать данные. Так, чтобы легко было их разбить на отдельные составляющие и каждая составляющая при этом была бы самодостаточна. Значит, либо хранить избыточные данные в файле, либо после подгрузки файла разбить его и трансформировать так, чтобы было удобно работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2014, 18:20
Помогаю со студенческими работами здесь

Поиск значения в txt файле по значению из другого txt
Добрый день. Подскажите пожалуйста как осуществить поиск значения в txt файле по значению из другого txt с помощью bat файла. Суть...

В текстовом файле расписание.txt через пробел записаны даты
помогите пожалуйста не могу ни как решить эту задачку( В текстовом файле расписание.txt через пробел записаны даты. Пользователь...

Поиск в тексте DOC-файлов последовательностей символов по шаблону и поиск найденных в TXT-файле (с логом)
Уважаемые программисты! Очень нужен bat-файл или скрипт, который решает такую задачу: 1. Осуществляет поиск в тексте массива...

В файле Date.txt записать различные исторические даты. PascalABC.NET
В файле Date.txt записать различные исторические даты. Каждая дата – это число, месяц, год и событие. Реализовать следующие операции: -...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru