Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.13;
Скачать: CL | DM;

Вниз

Поиск в StringList   Найти похожие ветки 

 
Валет   (2002-06-03 17:19) [0]

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


 
Song ©   (2002-06-03 17:22) [1]

IndexOf()


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

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

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


 
Yuri Btr ©   (2002-06-03 17:26) [3]

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:26) [4]

>Song © (03.06.02 17:22)


>Yuri Btr © (03.06.02 17:24)

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


 
Song ©   (2002-06-03 17:34) [5]

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


 
Song ©   (2002-06-03 17:38) [6]

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

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


 
Yuri Btr ©   (2002-06-03 17:39) [7]

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

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:42) [8]

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


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

>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 18:16) [10]

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

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;


 
Song ©   (2002-06-03 18:25) [11]

Ступил и здесь, понял ошибку, пора выключать комп и отдыхать. :)) Вот правильный вариант:
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


 
DeMoN-777 ©   (2002-06-03 18:44) [12]

>Song © (03.06.02 18:25)

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

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


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

>Song © (03.06.02 18:25)

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

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


 
Song ©   (2002-06-03 19:05) [14]

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


 
Song ©   (2002-06-03 19:08) [15]

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


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

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

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

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

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


 
Song ©   (2002-06-03 19:41) [17]

Так бы сразу и объяснили.
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 20:25) [18]

>Song © (03.06.02 19:41)

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



Страницы: 1 вся ветка

Текущий архив: 2002.06.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
4-40218
BAA
2002-04-10 21:06
2002.06.13
Оконная процедура....


1-40006
SleD
2002-06-03 17:31
2002.06.13
Как реализовать спящий режим под XP


1-39994
PTE
2002-06-03 12:37
2002.06.13
а как правильно выполнять арифмитические действия в StringGrid?


1-40034
bobr12
2002-05-31 14:57
2002.06.13
Вызов help-файла из приложения


6-40144
Зинец Виктор
2002-03-22 15:17
2002.06.13
Связь 2-х компов через ИНет