Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
ПрохожийСпб   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
11-1227450180
Дмитрий
2008-11-23 17:23
2011.02.20
Полоса прокрутки


9-1188473601
@!!ex
2007-08-30 15:33
2011.02.20
Загрузочный экран.


2-1290760671
Scott Storch
2010-11-26 11:37
2011.02.20
out- параметр интерфейс


15-1289645505
Novi4ok1992
2010-11-13 13:51
2011.02.20
Runtime 210


2-1291216049
Демерго
2010-12-01 18:07
2011.02.20
текст HTML Документа из TWebBrowser без тегов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский