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

Вниз

поиск и считывание текста   Найти похожие ветки 

 
ПрохожийСпб   (2010-11-26 11:34) [0]

есть текстфайл, есть там искомая подстрока и число, надо найти эту полдстроку и выдрать число.

использую
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)),
как выдрать число????


 
И. Павел ©   (2010-11-26 11:37) [1]

> использую


> Хоп нашел строку, и номер в ней,


> проблемы
> перевести его в цифру нет

Хоп - и все сделали. а проблема то в чем?

PS: судя по описанию задачи, тут было бы удобно использовать регулярные выражения. На delphimaster есть компоненты для работы с ними. Есть и другие пакеты.


 
И. Павел ©   (2010-11-26 11:41) [2]

Вот Regular Expression Library v.3.1 (4361kb):
http://www.delphimaster.ru/cgi-bin/news.pl?showpage=20


 
MonoLife ©   (2010-11-26 11:43) [3]


> как выдрать число????

inttostr(), floattostr()?


 
И. Павел ©   (2010-11-26 11:44) [4]

Пардон. Дал битую ссылку. Вот другая:
http://www.torry.net/vcl/vcltools/text/regexpr.zip


 
ПрохожийСпб   (2010-11-26 11:47) [5]

нет, я нашел помоему позицию в файле, где начинается это подстрока
файл открывается и закрывается в функции и далее не доступен

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


 
RWolf ©   (2010-11-26 11:51) [6]

регэкспами задачка решается в одно касание:
/wcolor=(\d+)/


 
ПрохожийСпб   (2010-11-26 23:01) [7]

И. Павел ©

спасибо, какой-то навороченный компонент,
с ходу не разберешся, но регкепы не понимает


 
Amoeba_   (2010-11-26 23:35) [8]

Использование VBScript RegExp в Delphi
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1062

Текст с высоты птичьего полета или Регулярные выражения
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=163


 
Inovet ©   (2010-11-27 00:10) [9]

Вот нафига весь файл грузить в память, я понимаю что она стала дешёвая, но нафига.


 
Германн ©   (2010-11-27 01:19) [10]


> Вот нафига весь файл грузить в память, я понимаю что она
> стала дешёвая, но нафига.

Имхо, это новая крайность. Батонокидатели первым образом ищут у компонента процедуру LoadFromFile().
Тем более, что старые учебники с AssignFile, Reset/Rewrite, Read/ReadLn/BlockRead благополучно забыты (Более того. На форумах уже эти методы работы с файлами уже считаются признаком ламерства). Вот только примеры работы со стримами не очень часты.


 
KSergey ©   (2010-11-27 07:27) [11]

А я как-то не понял приведенного кода.
Сначала вы пиш(и/е)те "строк нет (переводов каретки 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 имеем либо пустую строку, либо строку-число.
Понятно, что-то можно сократить и все такое, я просто сильно переделывать не стал.


 
mem   (2010-11-27 12:18) [12]


> Sergey ©   (27.11.10 07:27) [11]

шикарно. Это чтобы убедится, что точно нашли ту строку, по которой искали?)


 
KSergey ©   (2010-11-27 13:49) [13]

> mem   (27.11.10 12:18) [12]
> шикарно. Это чтобы убедится, что точно нашли ту строку, по которой искали?)

Не понял. Можно подробнее? Написано же

> После этого в s_num имеем либо пустую строку, либо строку-число.

Что не так?


 
mem   (2010-11-27 13:55) [14]


> Не понял. Можно подробнее? Написано же

прошу прощения, невнимательно прочитал что надо автору и
> for i := p + Length(S)



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1291200879
Демерго
2010-12-01 13:54
2011.02.20
Вытащить часть текста из Memo


2-1290837278
azim
2010-11-27 08:54
2011.02.20
Траснслятор мат выражений


15-1289481294
sniknik
2010-11-11 16:14
2011.02.20
Кто помнит функцию? Уголок статус бара.


15-1289390911
Kerk
2010-11-10 15:08
2011.02.20
Как такое решить?


15-1289597392
Юрий
2010-11-13 00:29
2011.02.20
С днем рождения ! 13 ноября 2010 суббота