Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Парсинг txt файла


Автор: pomogite 2.4.2010, 06:00
Здравствуйте, есть текст в мемо примерно такой - 
Код

<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 названия всех моделей...

Автор: Grag 2.4.2010, 08:30
Я бы сделал так: В цикле по всем строкам мемо брал строку, определял позицию вхождения подстроки "<a href=", затем с этой позиции определял позицию закрывающей скобки ">". запоминал ее, затем определял позицию следующей открывающей скобки "<", запоминал и ее. Все что между этими позициями копировал в мемо2. Это и будут названия моделей... Лобовое решение проблемы... smile 

Автор: Frees 2.4.2010, 08:45
TRegExp

Автор: Matematik 2.4.2010, 10:24
Регулярки 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>'

Автор: sbfactory 2.4.2010, 11:39
Можно сделать банально и просто:

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);


Вот как то так...

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

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

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

Точно, я просто сразу тут писал код, значит пусть заменит string на str;

Автор: pomogite 4.4.2010, 10:04
Всем большое спасибо, я разобралась =) 

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

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.

Автор: sbfactory 4.4.2010, 15:46
for i:=0 to Memo1.Lines.Count-1 do
 begin
 s:=Memo1.Lines.Text[i];
 memo2.Lines.Text:=ExtractLot(Memo1.Text);

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

Представь сколько в большом файле строк, каждая строка - обращение к компоненту мемо, что само по себе долго.
Советую загружать текст в TStringlist, обрабатывать, потом выводить его в мемо.

Автор: Dom 4.4.2010, 16:23
Мне кажется что дело тут в другом. 
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);

Автор: pomogite 4.4.2010, 17:57
Спасибо большое =) И правда цикл был ни к чему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)