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

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

поиск и считывание текста [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 есть компоненты для работы с ними. Есть и другие пакеты.


Наверх

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