Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорить парсер.. 
:(
    Опции темы
Mach3
Дата 28.9.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: 3
Всего: 2



Код

ntag:=0;
for j:=0 to l do begin
   if j=ntag then begin
       ftag:=posex('<td class="c_n" class="f14">', csom, j);
       ntag:=posex('</td>', csom, ftag);
       if ftag>n then  begin
           str:=copy(csom, ftag+28, ntag-(ftag+28));
           bars.Add(trim(str));
        end;
        n:=ftag;
    end else Continue
end;


Возможно ли ускорить (оптимизировать) как-нибудь этот "кусок"?
Заранее благодарен..
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
Matematik
Дата 28.9.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



что в переменной "l"?
Что код должен делать?

Это сообщение отредактировал(а) Matematik - 28.9.2010, 11:01
PM MAIL WWW ICQ   Вверх
Amphiluke
Дата 28.9.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Цитата(Matematik @  28.9.2010,  14:57 Найти цитируемый пост)
Что код должен делать?

Во всей видимости, выбирает текст из HTML-кода таблицы.  smile 

Это сообщение отредактировал(а) Amphiluke - 28.9.2010, 11:06
PM   Вверх
RomanEEP
Дата 28.9.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Код

var
  s: string;
  Pos, Pos2, EndPos: Integer;
  Bars: TStringList;
const
  sStart = '<td class="c_n" class="f14">';
  sEnd = '/td'>;
begin
  Pos := 1;
  EndPos := Length(s) - Length(sStart) - Length(sEnd);
  while Pos < EndPos do
  begin
    // находим начало строки
    Pos := PosEx(sStart, s, Pos);
    if Pos < 1 then
      break;
    // находим окончание
    Pos2 := PosEx(sEnd, s, Pos + Length(sStart));
    if Pos2 < 1 then
      break;
    // добавляем найденное
    Bars.Add(Trim(Copy(s, Pos + Length(sStart),
      Pos2 - Pos - Length(sStart) - Length(sEnd)));
    // готовимся к следующему витку цикла
    Pos := Pos2 + Length(sEnd);
  end;

PM MAIL   Вверх
Amphiluke
Дата 28.9.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Можно обойтись без PosEx (и сответственно, без StrUtils.pas) smile 
Код

function ParseTable(const TableCode: string): string;
const
  TAGOPEN = '<td class="c_n" class="f14">';
  TAGCLOSE = '</td>';
var
  i, j: Integer;
  aCode: string;
begin
  aCode := TableCode;
  Result := '';
  i := Pos(TAGOPEN, aCode);
  while i <> 0 do
  begin
    Delete(aCode, 1, i + 27);
    j := Pos(TAGCLOSE, aCode);
    Result := Result + Trim(Copy(aCode, 1, j - 1)) + #13#10;
    Delete(aCode, 1, j + 5);
    i := Pos(TAGOPEN, aCode);
  end;
end;


Использование:
Код

bars.Text := bars.Text + ParseTable(TableCodeHere);


Добавлено через 4 минуты и 45 секунд
В этом случае по мере парсинга строка, в которой ведется поиск, будет планомерно сокращаться, а быстродействие расти, что может быть полезно, если HTML-код таблицы очень большой.
PM   Вверх
RomanEEP
Дата 28.9.2010, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Цитата(Amphiluke @  28.9.2010,  12:12 Найти цитируемый пост)
В этом случае по мере парсинга строка, в которой ведется поиск, будет планомерно сокращаться, а быстродействие расти, что может быть полезно, если HTML-код таблицы очень большой.

т.к. PosEx ищет с нужного места, то поиск сокращается аналогично. а вот строка
Код

Delete(aCode, 1, i + 27);

приведет к копированию чудовищного объема данных, так же как и эта:
Код

Result := Result + Trim(Copy(aCode, 1, j - 1)) + #13#10;

+ нагрузка по разбиванию строки на подстроки, неучет возможности, что в ячейке таблицы есть символы переноса строки

PM MAIL   Вверх
Amphiluke
Дата 28.9.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Пожалуй, вы правы.
PM   Вверх
Mach3
Дата 28.9.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: 3
Всего: 2



примного благодарен за внимание..

RomanEEP, за счет чего ваш код будет работать более шустро?
извиняюсь, если не улавливаю очевидного..
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
RomanEEP
Дата 28.9.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Цитата(Mach3 @  28.9.2010,  13:06 Найти цитируемый пост)
RomanEEP, за счет чего ваш код будет работать более шустро?извиняюсь, если не улавливаю очевидного..

1) к примеру, если между 20 и 30 символом я нашел искомую строку, то следующую ищу уже с 30 + Length(sEnd)  символа, а твой код крутит цикл 6, 7, 8 и так далее до 30
2)уже с 30 символа пытается искать следующую, хотя надо искать с 30 + Length(sEnd) 
3)Если строка пустая, то цикл по j прокрутится всю длину строки
4)Я сделал мелкии оптимизации вроде того что после символа Length(s) - Length(sStart) - Length(sEnd); тоже ничего не будет найдено, т.к просто не уместится

ЗЫ: Можно оптимизировать и дальше, например сделать Trim на лету, совместить поиск конца подстроки с Copy, запихивать найденную подстроку в статический массив, чтобы избежать выделений памяти, может быть заменить Length() на константы (не уверен какой код там подставляет компилятор)

+ можно результаты хранить не в стринг листе, а запихивать в массив Integer начало и конец вхождения найденных подстрок

Это сообщение отредактировал(а) RomanEEP - 28.9.2010, 19:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.