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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг txt файла, Скопировать текст между тэгами 
V
    Опции темы
pomogite
  Дата 2.4.2010, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте, есть текст в мемо примерно такой - 
Код

<td class="tcl"><span class="Sell"><a href="http://magazin.ru/lot.php?id=588">Nokia 6600</a></span></td>
<td class="tcl"><span class="Sell"><a href="http://magazin.ru/lot.php?id=845">Nokia N72</a></span></td>

Как мне скопировать текст "Nokia 6600" в Memo 2? Если есть ещё куча других тэгов и id=588 естественно меняется,
то есть нужно вырезать в мемо2 названия всех моделей...
PM MAIL   Вверх
Grag
Дата 2.4.2010, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я бы сделал так: В цикле по всем строкам мемо брал строку, определял позицию вхождения подстроки "<a href=", затем с этой позиции определял позицию закрывающей скобки ">". запоминал ее, затем определял позицию следующей открывающей скобки "<", запоминал и ее. Все что между этими позициями копировал в мемо2. Это и будут названия моделей... Лобовое решение проблемы... smile 
PM MAIL ICQ Skype   Вверх
Frees
Дата 2.4.2010, 08:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 54



TRegExp


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Matematik
Дата 2.4.2010, 10:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Регулярки http://sites.google.com/site/kemiisto/article/tregexpr
Код

'<td class="tcl"><span class="Sell"><a href="http://magazin.ru/lot.php\?id=(\d+)">([^<]+)</a></span></td>'

PM MAIL WWW ICQ   Вверх
sbfactory
Дата 2.4.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно сделать банально и просто:

string:='<td class="tcl"><span class="Sell"><a href="http://magazin.ru/lot.php?id=588">Nokia 6600</a></span></td>';
///скопируем нужную часть строки:
string:=copy(string, lastdelimiter('">', string)+2, pos('</a>', string)-lastdelimiter('">', string)-3);

memo2.lines.add(string);


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


Опытный
**


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

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



sbfactory, string в качестве имени переменной ни в коем случае нельзя.
PM MAIL   Вверх
Akella
Дата 3.4.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



образец для поиска может выглядеть так, например: 
Код
>(.*?)</a>

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


Новичок



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

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



Цитата(Proxin @ 3.4.2010,  16:07)
sbfactory, string в качестве имени переменной ни в коем случае нельзя.

Точно, я просто сразу тут писал код, значит пусть заменит string на str;
PM MAIL   Вверх
pomogite
  Дата 4.4.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем большое спасибо, я разобралась =) 

Теперь возникла другая проблема, большие файлы очень долго обрабатываются, можно хоть как-то ускорить обработку?
Вот код:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils,ExtCtrls, IdBaseComponent, IdAntiFreezeBase,
  IdAntiFreeze;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  s:string;

implementation

{$R *.dfm}
uses RegExpr;

function ExtractLot(const AInputString : string) : string;
const
  Lot = 'id=(\d+)">([^<]+)</a>';
 var
  r : TRegExpr;
 begin
  Result := '';
  r := TRegExpr.Create;
  try
     r.Expression := Lot;
   if r.Exec (AInputString) then
      REPEAT
       Result := Result + r.Match[2]+#13;

      UNTIL not r.ExecNext;
    finally
        r.Free;
   end;
 end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('pars.txt');
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
for i:=0 to Memo1.Lines.Count-1 do
 begin
 s:=Memo1.Lines.Text[i];
 memo2.Lines.Text:=ExtractLot(Memo1.Text);
end;


end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Memo2.Lines.SaveToFile('result.txt');
end;

end.


Это сообщение отредактировал(а) pomogite - 4.4.2010, 11:45
PM MAIL   Вверх
sbfactory
Дата 4.4.2010, 15:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



for i:=0 to Memo1.Lines.Count-1 do
 begin
 s:=Memo1.Lines.Text[i];
 memo2.Lines.Text:=ExtractLot(Memo1.Text);

^ Собака тут зарыта ^

Представь сколько в большом файле строк, каждая строка - обращение к компоненту мемо, что само по себе долго.
Советую загружать текст в TStringlist, обрабатывать, потом выводить его в мемо.
PM MAIL   Вверх
Dom
Дата 4.4.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мне кажется что дело тут в другом. 
1. Тут что-то судя по всему лишнее. Например зачем переменная s?
Код

for i:=0 to Memo1.Lines.Count-1 do
 begin
 s:=Memo1.Lines.Text[i]; // зачем эта строка, если переменная s нигде не используется? И тогда зачем вообще цикл?
 memo2.Lines.Text:=ExtractLot(Memo1.Text);
end;

2. Передается в процедуру ExtractLot сразу все содержимое Мемо, и тогда зачем вообще использовать цикл?
3. Почему просто не написать?
Код

memo2.Text:=ExtractLot(Memo1.Text);

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


Бывалый
*


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

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



Спасибо большое =) И правда цикл был ни к чему.
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.0921 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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