Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск в StringList


Валет ©   (2002-06-03 17:19:00) 

Уважаемые мастера.
Передо мной встала следующая задача:
В выбранном текстовом файле необходимо произвести поиск по заданному в Edit-е слову.
После нахожденния данного слова его(заданное слово) и 25 символов идущих за ним необходимо добавить в листбокс.
Эту опирацию необходимо выполнять до тех пор пока не кончится файл.
Файл подгружается не в мемо или в ричь-эдит, а в стринглист.
Как такое реализовать ?
Буду очень признателен за любую оказанную помощь.


Валет   (2002-06-03 20:25:00) [1]

>Song © (03.06.02 19:41)

Спасибо огогромадное, выручил.


Song   (2002-06-03 19:41:00) [2]

Так бы сразу и объяснили.
procedure TForm1.Button1Click(Sender: TObject);
Var S:String;
begin
With TStringList.Create Do
try
LoadFromFile("c:\demo.txt");
While Pos(Edit1.Text,Text)>0 Do
Begin
ListBox1.items.Add(Copy(Text,Pos(Edit1.Text,Text),25+Length(Edit1.Text)));
S:=Text;
System.Delete(S,Pos(Edit1.Text,Text),25+Length(Edit1.Text));
Text:=S;
End;
finally
Free;
end;
end;


Валет   (2002-06-03 19:27:00) [3]

Поясняю вопрос.
Например содержимое файла Demo.txt такое
*************************************************************
«Сертификат веб-узла» подтверждает подлинность данного веб-узлаи гарантирует, что с ним безопасно работать. Благодаря этому другие веб-узлы не могут использовать идентификатор исходного защищенного узла. При отправке личных сведений через Интернет желательно проверить сертификат веб-узла, чтобы убедиться в безопасности отправляемых личных сведений. При загрузке программного обеспечения с веб-узласертификаты можно использовать для проверки надежности источника программного обеспечения.

*************************************************************

Дык вот поиск по слову веб-узла должен добавить в ListBox следующее:
1.item - веб-узла + 25 символов после него ( и гарантирует, что с ним)
2.item - веб-узла + 25 символов после него (, чтобы убедиться в безоп)
3.item - веб-узла + 25 символов после него ( сертификаты можно исполь)

и т.д. если в файле ещё встречается слово "веб-узла".


Song   (2002-06-03 19:08:00) [4]

Вполне возможно Вы написали не полностью так как я написал и запутались в With например IndexOf() у Вас применяетя к TListBox, а не TStringList. В какой строке ошибка ?


Song   (2002-06-03 19:05:00) [5]

2Валет (03.06.02 18:44)
Последний вариант я писал уже в Дельфи всё работало.
Edit1.Text был равен "test"
Файл demo.txt такой:
************************
kkk
test
12345
12345
12345
12345
12345
67891
***********************


Валет   (2002-06-03 18:44:00) [6]

>Song © (03.06.02 18:25)

И вновь трабла =(

Error "List index out of bounds(-1)"


DeMoN-777   (2002-06-03 18:44:00) [7]

>Song © (03.06.02 18:25)

И вновь трабла =(

Error "List index out of bounds(-1)"


Song   (2002-06-03 18:25:00) [8]

Ступил и здесь, понял ошибку, пора выключать комп и отдыхать. :)) Вот правильный вариант:
procedure TForm1.Button1Click(Sender: TObject);
Var S:String;
begin
With TStringList.Create Do
try
LoadFromFile("c:\demo.txt");
S:=Strings[IndexOf(Edit1.text)]+Copy(Text,Pos(#13#10+Edit1.Text+#13#10,Text)+Length(Edit1.Text)+4,35);
S:=StringReplace(S,#13#10,"",[rfReplaceAll]);
ListBox1.items.Add(S);
finally
Free;
end;
end;


35 потому что нужно 25 символов и ещё плюс пять раз по 2 символа (ODOA) = 35


Song   (2002-06-03 18:16:00) [9]

:)) Сам понимаешь окончание рабочего дня

procedure TForm1.Button1Click(Sender: TObject);
Var S:String;
begin
With TStringList.Create Do
try
LoadFromFile("c:\demo.txt");
S:=Strings[IndexOf(Edit1.text)]+Copy(Text,Pos(#13#10+Edit1.Text+#13#10,Text)+4+Length(Edit1.Text),25+4+Length(Edit1.Text));
S:=StringReplace(S,#13#10,"",[rfReplaceAll]);
ListBox1.items.Add(S);
finally
Free;
end;
end;


Валет   (2002-06-03 18:04:00) [10]

>Yuri Btr © (03.06.02 17:39)

Так ошибку выдаёт.

procedure TForm1.Button1Click(Sender: TObject);
var
s:WideString;
i:integer;
stringlist:TstringList;
begin
stringlist.Create;
stringlist.LoadFromFile("c:\demo.txt");
s:="";
for i:=0 to StringList.Count-1 do
s:=s+StringList[i];
While AnsiPos(Edit1.text,s)>0 do
begin
ListBox1.Items.add(Copy(s,AnsiPos(Edit1.text,s),Length(Edit1.text)+25));
Delete(s,0,AnsiPos(Edit1.text,s)+Length(Edit1.text)+25);
end;
end;


>Song © (03.06.02 17:42)

А так ничего не происходит.
procedure TForm1.Button1Click(Sender: TObject);
var
files: tstringlist;
s: string;
begin
files.Create;
files.LoadFromFile("c:\demo.txt");
With files Do S:=Strings[IndexOf(Edit1.text)]+Copy(Text,Pos(#13#10+Edit1.text+#13#10,Text)+2,27);
S:=StringReplace(S,#13#10,"",[rfReplaceAll]);
ListBox1.items.Add(S);
end;


???


Song   (2002-06-03 17:42:00) [11]

Sorry, не туда вставил перевод строки :))
Так надёжней:

With TStringList Do S:=Strings[IndexOf("test")]+Copy(Text,Pos(#13#10+"test"+#13#10,Text)+2,27);
S:=StringReplace(S,#13#10,"",[rfReplaceAll]);
ListBox1.Add(S);


Yuri Btr   (2002-06-03 17:39:00) [12]

Тьфу ты...
Пишу по памяти - ужасно глючно, но смысл ясен

var
s:WideString;
i:integer;
stringlist:TstringList;
-----------------------
s:="";
for i:=0 to StringList.Count-1
do
s:=s+StringList[i];
While AnsiPos(Edit.text,s)>0
do
begin
ListBox.AddItem(Copy(s,AnsiPos(Edit.text,s),Length(Edit.text)+25));
Delete(s,0,AnsiPos(Edit.text,s)+Length(Edit.text)+25))
end;


Song   (2002-06-03 17:38:00) [13]

Так надёжней:

With TStringList Do S:=Strings[IndexOf(#13#10+"test"+#13#10)]+Copy(Text+2,Pos("test",Text),27);
S:=StringReplace(S,#13#10,"",[rfReplaceAll]);
ListBox1.Add(S);


Song   (2002-06-03 17:34:00) [14]

With TStringList Do ListBox1.Add(Strings[IndexOf("test")]+Copy(Text,Pos("test",Text),25));


Валет   (2002-06-03 17:26:00) [15]

>Song © (03.06.02 17:22)


>Yuri Btr © (03.06.02 17:24)

А можно пример ?
Хотя-бы на скорую руку.


Yuri Btr   (2002-06-03 17:26:00) [16]

Yuri Btr © (03.06.02 16:46)
Наверное надо склеить все строки в стринглисте и затем определить вхождение (AnsiPos)текста из Edit в полученную строку, определим позицию первого символа, делаем Copy фрагмента строки - с длиной Length(Edit.text)+25, удаляем все символы до позиции первого символа, рекурсией ищем дальнейшие вхождения.
Наверно так.

MBo © (03.06.02 16:58)
stringlist.text содержит все строки в одной. Учти CRLF.

Валет (03.06.02 17:14)
А как в нём поиск-то осуществить (stringlist.text)?

Yuri Btr © (03.06.02 17:24)
Всё тем же способом, как я описал. Только пропускаешь склейку строк, и дополнительно ищешь #13 в полученном тексте и удаляешь его, а затем всё как я написал.
Удаляем символы через Delete.


Валет   (2002-06-03 17:25:00) [17]

>Song © (03.06.02 17:22)
>IndexOf()

Как после нахожденния данного слова его(заданное слово) и 25 символов идущих за ним необходимо добавить в листбокс ?


Song   (2002-06-03 17:22:00) [18]

IndexOf()


Наверх

Титульная страница Поиск, карта сайта Написать письмо