Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,154
Записей в блоге: 3

StringReplace долго обрабатывает длинные тексты

29.09.2014, 16:54. Показов 2251. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня!
Собственно сам вопрос на счет функции StringReplace..она отлично заменяет, но если строка с выше 2000 символов, то очень тормозит...автор Этой статьи так же с этим столкнулся и реализовал свой алгоритм на делфи...но что то не получается его перевести на Borland....вот сам вопрос, как можно ускорить процесс обработки за счет StringReplace или просто помочь перевести код
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.09.2014, 16:54
Ответы с готовыми решениями:

Длинные тексты в TDBGrid
Надо отображать достаточно длинные текстовые поля (80-100 символов) но не Memo. Желательно в табличном виде. В TDBGrid так и не нашел...

Компьютер долго обрабатывает операции
Ноутбук стал долго обрабатывать операции, в том числе и простые.Например перетащить ярлык, переименовать ярлык. При запуске игр начинает...

StringReplace
CellText := StringReplace(CellText, #0$D,'', ); ошибка Missing operator or semicolon в чем проблема?

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
29.09.2014, 17:30
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Не надо ничего переводить, просто напиши вот такой модуль:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
unit FastStrReplaceUnit;
 
interface
 
uses SysUtils;
 
function FastStringReplace(const S: string; OldPattern: string;
  const NewPattern: string; Flags: TReplaceFlags = [rfReplaceAll]): string;
 
implementation
 
function FastStringReplace(const S: string; OldPattern: string;
  const NewPattern: string; Flags: TReplaceFlags): string;
var
  I, J, Idx: Integer;
  IsEqual: Boolean;
  UpperFindStr: string;
  pS: PChar; // Указатель на массив для сравнения символов
  CanReplace: Boolean;
begin
  if OldPattern = '' then
  begin
    Result := S;
    Exit;
  end;
 
  Result := '';
  if S = '' then
    Exit;
 
  if rfIgnoreCase in Flags then
  begin
    OldPattern := AnsiUpperCase(OldPattern);
 
    // Для режима "не учитывать регистр"
    // потребуется дополнительная строка
    UpperFindStr := AnsiUpperCase(S);
 
    pS := PChar(UpperFindStr);
  end
  else
    pS := PChar(S);
 
  // Если новая подстрока не превышает старой, то...
  if Length(OldPattern) >= Length(NewPattern) then
  begin
    SetLength(Result, Length(S));
  end
  else // Точный размер буфера не известен...
    SetLength(Result, (Length(S) + Length(OldPattern) +
      Length(NewPattern)) * 2);
 
  I := 1;
  Idx := 0;
  CanReplace := True;
  while I <= Length(S) do
  begin
    IsEqual := False;
 
    if CanReplace then // Если замена разрешена
    begin
      // Если I-й символ совпадает с OldPattern[1]
      if pS[I - 1] = OldPattern[1] then // Запускаем цикл поиска
      begin
        IsEqual := True;
        for J := 2 to Length(OldPattern) do
        begin
          if pS[I + J - 2] <> OldPattern[J] then
          begin
            IsEqual := False;
            Break; // Прерываем внутренний цикл
          end;
        end;
 
        // Совпадение найдено! Выполняем замену
        if IsEqual then
        begin
          for J := 1 to Length(NewPattern) do
          begin
            Inc(Idx);
 
            // Расширяем строку Result при необходимости
            if Idx > Length(Result) then
              SetLength(Result, Length(Result) * 2);
 
            Result[Idx] := NewPattern[J];
          end;
 
          // Пропускаем байты в исходной строке
          Inc(I, Length(OldPattern));
 
          if not(rfReplaceAll in Flags) then
            CanReplace := False; // Запрещаем дальнейшую замену
        end;
      end;
    end;
 
    // Если подстрока не найдена, то просто копируем символ
    if not IsEqual then
    begin
      Inc(Idx);
 
      // Расширяем строку Result при необходимости
      if Idx > Length(Result) then
        SetLength(Result, Length(Result) * 2);
 
      Result[Idx] := S[I];
      Inc(I);
    end;
  end; // while I <= Length(S) do
 
  // Ограничиваем длину строки-результата
  SetLength(Result, Idx);
end;
 
end.
, сохрани его в файле FastStrReplaceUnit.pas, и подключи к проекту. После первой пересборки будет создан h-файл с тем же именем, подключив который, ты прекрасно сможешь работать с этой функцией из Билдера...
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,154
Записей в блоге: 3
29.09.2014, 17:53  [ТС]
Хочу добавить следующее, еще поискал в интернете, нашел еще один пример

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
inline void MyCopy(AnsiString &Ret,char *cs,int n,int &LRet)
{
  int RetLength=Ret.Length();
  if (RetLength<LRet+n) Ret.SetLength(RetLength+2*n);
  memcpy(Ret.c_str()+LRet,cs,n);
  LRet+=n;
}
//--------------------------------------------------------------------------
AnsiString MyStringReplaceAll(AnsiString s,AnsiString f,AnsiString r)
{
  int sL=s.Length();
  int fL=f.Length();
  int rL=r.Length();
 
  AnsiString Ret;
  Ret.SetLength(sL);
  int LRet=0;
 
  char *cs=s.c_str();
  char *csL=cs+sL;
  char *cf=f.c_str();
  char *cr=r.c_str();
 
  do
  {
    char *cs_found=StrPos(cs,cf);
    if (!cs_found)
    {
      MyCopy(Ret,cs,csL-cs,LRet);
      cs=csL;
    }
    else
    {
      MyCopy(Ret,cs,cs_found-cs,LRet);
      MyCopy(Ret,cr,rL,LRet);
      cs=cs_found+fL;
    }
  }while(cs<csL);
 
  Ret.SetLength(LRet);
  return Ret;
}
//---------------------------------------------------------------------------
Это в разы увеличивает скорость обработки....позже отпишу какой из способов быстрее

Добавлено через 19 минут
Удивительно, прирост производительности в первом случае почти в 300 раз, во втором случае только в 30 (что все равно луче чем было)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.09.2014, 17:53
Помогаю со студенческими работами здесь

StringReplace
AssignFile(F, '1.txt'); Reset(F); while not Eof(F) do begin readln(f, tmp); name:=tmp;

StringReplace
var s: string; begin S:= form1.Edit3.Text; S:= StringReplace(S, '- ', '-', ); Идея такова, мне необходимо все &quot;дефис...

StringReplace
AnsiString shost=StringReplace(&quot;svr::c11&quot;, &quot;::c11&quot;, &quot;&quot;, TReplaceFlags()&lt;&lt; rfReplaceAll &lt;&lt; rfIgnoreCase); в результате должно быть svr а...

StringReplace
Подскажите у меня есть строка StringReplace(ExtractFileName(CurrentFile),'й','и', ); она меняет &quot;привей&quot;, на...

Stringreplace
Добрый вечер, помогите, что я делаю не так : var total:string; begin total:=' lolka '; srichedit1.Text :=...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru