Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 22.03.2014, 21:37   #11
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Или я чего-то недопонял, или все хором забыли о регулярке? По поводу последнего кода не в обиду, но ужас и кошмар. Восемь переменных под такую простую задачу это охренеть какой перебор. Вручную это всё делается намного проще.

Код:
procedure TForm1.parsing(s: string);
begin
  while pos('<p>', s) > 0 do // пока есть тег <p>
    begin
      Delete(s, 1, pos('<p>', s) + 2); // удаляем строку до этого тега
      Memo1.Lines.Add(Copy(s, 1, pos('</p>', s) - 1)); // выводим отрезок строки от первого символа до тега </p> к примеру в memo
    end;
end;
Пойдёт?

P.S Вопрос на засыпку
Цитата:
Сообщение от PaHaNjkee Посмотреть сообщение
Код:
parstext := Memo1.Lines.Text;
Код:
parstext := Memo1.Text;
В чём отличие?

Последний раз редактировалось XE5; 22.03.2014 в 21:45.
XE5 вне форума
Старый 22.03.2014, 22:16   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

удаление из строки крайне не эффективная операция в плане производительности (хотя и вполне практически вполне допустимо использовать такой подход, если длина строки не очень большая, скажем, не превышает десятки тысяч символов), я бы предложил решение через использование PosEx

примерно так:
Код:
implementation
uses StrUtils;

...

procedure TForm1.parsing(const s: string);
var link : string;
  iPos1, iPos2 : integer;
begin
  iPos1 := 0;
  while PosEx('<P>', AnsiUpperCase(s), iPos1+1)>0 do
  begin
     iPos1 := PosEx('<P>', AnsiUpperCase(s), iPos1+1);
     iPos2 := PosEx('</P>', AnsiUpperCase(s), iPos1+1);
     if iPos2>0 then begin
          memo2.Lines.Append(Copy(s, iPos1+3, iPos2-iPos1-3));
          iPos1 := iPos2;
     end;

  end;
end;

Последний раз редактировалось Serge_Bliznykov; 22.03.2014 в 22:31.
Serge_Bliznykov вне форума
Старый 22.03.2014, 23:19   #13
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Serge_Bliznykov Есть мнение, что AnsiUpperCase сожрёт весь прирост скорости, и ВОЗМОЖНО в итоге Ваш код проиграет в производительности моему .
P.S. Не знал о функции PosEx. Любопытно... Хотя можно и без неё написать такой же код без Delete через Copy и доп. String.

Последний раз редактировалось XE5; 22.03.2014 в 23:22.
XE5 вне форума
Старый 22.03.2014, 23:24   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Есть мнение, что AnsiUpperCase сожрёт весь прирост скорости
Ни чего не мешает это сделать один раз перед циклом. Тогда сжирания не будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 22.03.2014, 23:27   #15
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Аватар И в итоге оба кода можно поправить и слегка поднять производительность.
P.S. Кто бы мне под мои задачи давал по два варианта решений...
XE5 вне форума
Старый 22.03.2014, 23:30   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Все можно. По хорошему и при использовании Delete тоже нужно приводить к одному регистру. Гарантии то нет, что везде <p>. А Delete и правда очень затратная, без вариантов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 22.03.2014, 23:35   #17
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
примерно так:
Код:
implementation
uses StrUtils;

...

procedure TForm1.parsing(s: string);
var
  iPos1, iPos2 : integer;
begin
  iPos1 := 1;
  s:=AnsiUpperCase(s);
  while true do
  begin
     iPos1 := PosEx('<P>', s, iPos1);
     if iPos1 = 0 break;
     inc(iPos1, 3);
     iPos2 := PosEx('</P>', s, iPos1);
     if iPos2>0 then begin
          memo2.Lines.Append(Copy(s, iPos1, iPos2-iPos1));
          iPos1 := iPos2+4;
     end else break;

  end;
end;
Навскидку оптимизировал.
Arigato на форуме
Старый 22.03.2014, 23:44   #18
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Delete как я понимаю, это цикличный сдвиг элементов массива строки влево, и изменение длины массива? И собственно из за цикла снижение производительности. Верно?
XE5 вне форума
Старый 23.03.2014, 10:24   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Delete как я понимаю
Нет там циклического сдвига. Загляни в генофонд.
I'm learning to live...
Stilet вне форума
Старый 23.03.2014, 14:00   #20
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Stilet Тогда с какого перепуга Delete стал ресурсоёмкой операцией?
XE5 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг Gudzik11 Общие вопросы Delphi 6 15.04.2012 21:51
парсинг Pein95 C# (си шарп) 3 16.09.2011 01:24
Парсинг DeDoK Общие вопросы Delphi 8 02.02.2011 14:20