Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Antiplayer
129 / 112 / 39
Регистрация: 27.09.2012
Сообщений: 305

Поиск по маске в большом текстовом файле

09.02.2016, 22:51. Показов 2615. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возник вопрос, имеются текстовые файлы, содержащие от 300 000 строк, в них надо найти определенные слова, желательно по маске вида: "c%%%%x610x8".
C++
1
2
3
4
5
6
7
8
9
AnsiString search;
RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
for (int i = 0; i < RichEdit1->Lines->Count; i++) {
      search=RichEdit1->Lines->Strings[i];
      int index = search.Pos("с00");  /* найдем начало слова */
      if( index != 0 ) {
   Memo1->Lines->Add(search);
}
     }
Такой код не дает адекватно задать маску(но это решаемо), но главное, что выполняется он невероятно долго. Уже 10 минут ищет, и думаю, это далеко не конец. Прошу помощи, даже код не обязательно. Просто подкиньте идею, алгоритм, компонент. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2016, 22:51
Ответы с готовыми решениями:

Поиск в текстовом файле предложений, соответствующих маске
Задано маску, которая состоит из набора целых чисел. Каждое число определяет кол-во букв в соответствующем слове. Например: &quot;1 3 7...

Поиск по маске в большом количестве файлов
Здравствуйте, интересует такой вопрос, есть папки, в которые каждый день пишутся 60к-100к файлов. Поиск по маске по прошлым дням происходит...

Замена в текстовом файле строк по маске
подскажите, можно ли как то замену по маске делать в txt ? например надо найти &lt;sup&gt;&lt;a name=r3&gt;&lt;a href=&quot;#n_3&quot;...

9
113 / 75 / 28
Регистрация: 26.07.2015
Сообщений: 124
09.02.2016, 23:14
Цитата Сообщение от Antiplayer Посмотреть сообщение
Просто подкиньте идею
Как вариант - использовать регулярные выражения для поиска
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
09.02.2016, 23:34
Цитата Сообщение от Antiplayer Посмотреть сообщение
Просто подкиньте идею
Работать напрямую с Memo - плохая идея. Этот визуальный компонент постоянно форматируется при изменении в нем текста и от этого крайне медлителен. В этом можно убедиться, если использовать невизуальный список (TStringList); и только после завершения цикла подключить Memo.
C++
1
2
3
if(RichEdit1->Lines->Strings[i].Pos("c00")) myStringList->Add(RichEdit1->Lines->Strings[i]);
. . .
Memo1->Lines->Assign(myStringList);
1
 Аватар для Antiplayer
129 / 112 / 39
Регистрация: 27.09.2012
Сообщений: 305
10.02.2016, 00:24  [ТС]
Я тоже так думал, но так как искомых слов там меньше десятка может быть, я не думал, что это существенно влияет на производительность. Ведь в Мемо пишется только тогда, когда искомое будет найдено.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
10.02.2016, 09:46
Цитата Сообщение от Nataly_K Посмотреть сообщение
Как вариант - использовать регулярные выражения для поиска
Полностью согласен, регулярки тут помогут, да и отработают быстрее.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.02.2016, 12:04
Я вообще ничего не понимаю. Моя логика в ступоре! Простой цикл посимвольного перебора
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    TStringList *SL1 = new TStringList;
    TStringList *SL2 = new TStringList;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    SL1->LoadFromFile(".\\test.txt");
    int a = 0, b = SL1->Text.Length()-3, i;
   Label1->Caption = TimeToStr(Time()); Label1->Repaint();
    for(i=1;i<b;++i)
      if(SL1->Text[i]=='\r')
      { if( SL1->Text[i+1]=='\n') a++; }
//     else if(SL1->Text[i]=='s' && SL1->Text[i+1]=='0' && SL1->Text[i+2]=='0')
//       SL2->Add(SL1->Strings[a]);
//    Memo1->Lines->Assign(SL2);
   Label2->Caption = TimeToStr(Time());
}
вешает программу на минуты (я так и не дождался)! Хотя обычный редактор AkelPad находит в том же файле трехбайтовую последовательность в самом конце файла за доли секунды!! <файл размером 23 Мб, - около 400000 строк длиной до 80 символов>.
?!!! Спасайте практикантропа!
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
10.02.2016, 12:08
А если регулярку заюзать ?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.02.2016, 13:16
Цитата Сообщение от nick42 Посмотреть сообщение
Я вообще ничего не понимаю.
В общем, как я понимаю, не нужно использовать строки при таких объемах; мутная они штука в Билдере. Если попробовать через TMemoryStream и буфер анализировать, то все должно получиться.
0
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
11.02.2016, 21:21
Привет Практикантроп!
Вы же выше использовали Pos() метод. Он же быстро работает.
Например, я его использовал в TStringList с большими файлами. Очень шустро ищет.
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
11.02.2016, 23:54
Ну, видимо так. Для работы со строками нужно знать определенные приемы или методы обработки, дающие быстрейший результат. Я попробовал простейший, с моей точки зрения, цикл - и чуть не пережег предохранители. Скорее всего посимвольная обработка символов в строке - это не то, как я себе представляю: выборочное обращение к монотонному массиву байтов, а достаточно сложные операции с многочисленными анализами. И в длинном цикле эти задержки оказываются настолько существенными, что ставят крест на таком подходе. Вот за что я и "люблю" С, сравнительно с ассемблером... - мизер "в тёмную".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2016, 23:54
Помогаю со студенческими работами здесь

Удаление дублирующих строк в текстовом файле по маске
Здравствуйте! Есть файл file_in.txt - список прокси построчно. Его нужно отфильтровать. 1. Нужно найти строки-дублёры по маске, к...

Поиск слов по маске в текстовом редакторе
Здравствуйте, возникла проблема, нужно реализовать текстовый редактор с подсчетом статистики(гласные буквы, согласные и т.д), а также...

Поиск выражения в текстовом поле по маске
Друзья, есть вопрос: В поле типа MEMO расположен текст, в котором такая структура: &quot;Позиция 1. ....какой-то текст.... ...

Поиск элементов в большом файле
ЧИТАТЬ МНОГО, но ничего сложного в этом тексте нету:) Здравствуйте:) Подскажите пожалуйста где копать информацию касательно моей...

Поиск строк в большом файле
Здравствуйте! Не подскажите ли, как лучше организовать программу, цель которой переписать из одного файла в другой строки, содержащие...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru