![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
поиск и считывание текста [D5, XP]
ПрохожийСпб © (2010-11-26 11:34:00)есть текстфайл, есть там искомая подстрока и число, надо найти эту полдстроку и выдрать число.
использую
function FindWordInFile(const FileName, S: string; var Found: string): Integer;
var
List: TStringList;
Index: Integer;
begin
Result:= -1;
if not FileExists(FileName)
then Exit;
List:= TStringList.Create();
List.LoadFromFile(FileName);
try
for Index:= 0 to List.Count - 1 do
if Pos(S, List[Index]) <> 0
then begin
Result:= Index;
Found:= List[Index];
Break;
end;
finally
List.Free();
end;
end;
S:='wcolor=">';
W:=FindWordInFile('settings.xhtm',S,Found);
if W<>-1 then begin
showmessage(IntToStr(W));
end;
Хоп нашел строку, и номер в ней,
после последнего знака (=) будет число(в строковом формате конечно)
одно,двух или трехразрядное, потом пробел.
Надо как то его достать в строковом формате, потом проблемы
перевести его в цифру нет (функция val)
файлы по 20 кб, строк нет (переводов каретки chr(13)),
как выдрать число????
mem (2010-11-27 13:55:00) [1]
> Не понял. Можно подробнее? Написано же
прошу прощения, невнимательно прочитал что надо автору и
> for i := p + Length(S)
KSergey (2010-11-27 13:49:00) [2]> mem (27.11.10 12:18) [12]
> шикарно. Это чтобы убедится, что точно нашли ту строку, по которой искали?)
Не понял. Можно подробнее? Написано же
> После этого в s_num имеем либо пустую строку, либо строку-число.
Что не так?
mem (2010-11-27 12:18:00) [3]
> Sergey © (27.11.10 07:27) [11]
шикарно. Это чтобы убедится, что точно нашли ту строку, по которой искали?)
KSergey (2010-11-27 07:27:00) [4]А я как-то не понял приведенного кода.
Сначала вы пиш(и/е)те " строк нет (переводов каретки chr(13))", однако в TStringList бегаете по строкам, т.е. как будто предполагаете, что их загрузится больше одной.
Далее. Находите строку, в которой есть искомый шаблон - и всюее возвращаете. Зачем?
Ну ладно, положим это мы решили задачу "как найти строку в файле, где есть искомый шаблон". Причем шаблон тоже нашли (его позицию в строке).
Ну а далее и вовсе просто:
p, i: integer;
s_num: String;
.......
// if Pos(S, List[Index]) <> 0
p := Pos(S, List[Index]);
if p > 0
then begin
Result:= Index;
Found:= List[Index];
s_num := '';
for i := p + Length(S) to Length(Found) do
if Found[i] in ['0'..'9'] then
s_num := s_num + Found[i]
else
Break;
Break;
end;
После этого в s_num имеем либо пустую строку, либо строку-число.
Понятно, что-то можно сократить и все такое, я просто сильно переделывать не стал.
Германн (2010-11-27 01:19:00) [5]
> Вот нафига весь файл грузить в память, я понимаю что она
> стала дешёвая, но нафига.
Имхо, это новая крайность. Батонокидатели первым образом ищут у компонента процедуру LoadFromFile().
Тем более, что старые учебники с AssignFile, Reset/Rewrite, Read/ReadLn/BlockRead благополучно забыты (Более того. На форумах уже эти методы работы с файлами уже считаются признаком ламерства). Вот только примеры работы со стримами не очень часты.
Inovet (2010-11-27 00:10:00) [6]Вот нафига весь файл грузить в память, я понимаю что она стала дешёвая, но нафига.
Amoeba_ (2010-11-26 23:35:00) [7]Использование VBScript RegExp в Delphi
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1062
Текст с высоты птичьего полета или Регулярные выражения
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=163
ПрохожийСпб (2010-11-26 23:01:00) [8]И. Павел ©
спасибо, какой-то навороченный компонент,
с ходу не разберешся, но регкепы не понимает
RWolf (2010-11-26 11:51:00) [9]регэкспами задачка решается в одно касание:
/wcolor=(\d+)/
ПрохожийСпб (2010-11-26 11:47:00) [10]нет, я нашел помоему позицию в файле, где начинается это подстрока
файл открывается и закрывается в функции и далее не доступен
if W<>-1 then begin
showmessage(IntToStr(W));
s:=copy(File,W+8,20);
showmessage(s);
end;
надо что то вроде этого,
где File - тестовая строка размером в файл, интересно влезет?
W+8 - позиция подстроки + смещение, первая позиция цифры.
20-копирую побольше, далее можно проанализировать всю эту строку
и найти пробел.
wcolor=239 hcolor=255
достать надо 239
И. Павел (2010-11-26 11:44:00) [11]Пардон. Дал битую ссылку. Вот другая:
http://www.torry.net/vcl/vcltools/text/regexpr.zip
MonoLife (2010-11-26 11:43:00) [12]
> как выдрать число????
inttostr(), floattostr()?
И. Павел (2010-11-26 11:41:00) [13]Вот Regular Expression Library v.3.1 (4361kb):
http://www.delphimaster.ru/cgi-bin/news.pl?showpage=20
И. Павел (2010-11-26 11:37:00) [14]> использую
> Хоп нашел строку, и номер в ней,
> проблемы
> перевести его в цифру нет
Хоп - и все сделали. а проблема то в чем?
PS: судя по описанию задачи, тут было бы удобно использовать регулярные выражения. На delphimaster есть компоненты для работы с ними. Есть и другие пакеты.