Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.07.2012, 16:41
Rocat Rocat вне форума
Прохожий
 
Регистрация: 04.07.2012
Адрес: Киров
Сообщения: 6
Версия Delphi: 7
Репутация: 10
По умолчанию найти слово в тексте

имеется текстовый файл с данными. небходимо написать процедурку которая будет записывать текст в ячейку стрингГрид-а, находящийся между двух определенных подстрок, например:
<условие>
нужный текст
<#условие>

понимаю что надо читать файл до тех пор, пока не встретим необходимую комбинацию символов...как реализовать?..

Последний раз редактировалось Rocat, 04.07.2012 в 16:58.
Ответить с цитированием
  #2  
Старый 04.07.2012, 20:11
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Файл можно и не читать. Есть функция POS.
Код:
var a,b:char;

a:=pos('первое что ищем', номер строки);
b:=pos('второе что ищем', номер строки);
Текст между этими pos'ами будет
Код:
copy(строка,a - начало,b-a+1 - количество символов)
Т.е. копируем в "строке" "количество символов", начиная с "начала".

Работает только с одной строкой. Но в ячейку тоже всё одной строкой придётся записывать. А вот текст между несколькими строками уже не знаю как вычленить.

Последний раз редактировалось R-18Rus, 04.07.2012 в 20:13.
Ответить с цитированием
  #3  
Старый 04.07.2012, 21:34
Rocat Rocat вне форума
Прохожий
 
Регистрация: 04.07.2012
Адрес: Киров
Сообщения: 6
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от R-18Rus
Файл можно и не читать. Есть функция POS.

но я ведь не знаю, в какой строке окажется это слово. может можно как то перевести текст в массив строк?
Ответить с цитированием
  #4  
Старый 04.07.2012, 21:39
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Цитата:
Сообщение от R-18Rus
Код:
var a,b:char;

a:=pos('первое что ищем', номер строки);
b:=pos('второе что ищем', номер строки);
Функция pos возвращает все-таки значение типа integer, значит
Код:
var a,b:integer;
И ищет она не в номере строки, а в самой строке, отсюда:
Код:
a:=pos('первое что ищем', Строка);
b:=pos('второе что ищем', Строка(или "строка[номер]"-смотря откуда она);
Все остальное кажись верно, только copy - тоже функция, отсюда
Код:
StringGrid1.Cells[aCol, aRow]:=copy(строка,a,b-a+1);
Ответить с цитированием
  #5  
Старый 04.07.2012, 21:39
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Можно "читать" файл в цикле для поиска нужной строки, можно сразу загрузить всё в StringList и использовать его возможности по поиску.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 04.07.2012, 21:45
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Можешь загружать файл в стринглист, тогда его свойство Text будет содержать все строки файла:
Код:
var StrLst:TStringList;
a,b:integer;
begin
strlst:=TStringList.Create;
StrLst.LoadFromFile('путь к файлу');
a:=pos(substr1, StrLst.Text);
b:=pos(substr2, StrLst.Text);
StringGrid1.Cells[aCol, aRow]:=copy(StrLst.Text,a+length(substr1),b-(a+length(substr1))+1);
StrLst.Free.
end;

Последний раз редактировалось YVitaliy, 04.07.2012 в 21:51.
Ответить с цитированием
  #7  
Старый 05.07.2012, 08:27
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от YVitaliy
a+length(substr1)
Это будет начало того, чего искали? По-моему это конец.
А с переменными спутал маленько, извините.
Ответить с цитированием
  #8  
Старый 05.07.2012, 08:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

для начала: какой макс. размер файла? байты, Кб, Мб, Гб, Тб?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 05.07.2012, 08:48
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Дядя, учи регэкспы.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #10  
Старый 06.07.2012, 10:25
Rocat Rocat вне форума
Прохожий
 
Регистрация: 04.07.2012
Адрес: Киров
Сообщения: 6
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
для начала: какой макс. размер файла? байты, Кб, Мб, Гб, Тб?
исходный файл латеховский, размер в Мб.вот что получилось у меня, из наброска(читает файл, заносит нужное в ячейку):
Код:
 var Fz: textFile;
    us, kus, st: string;
    k, k1, l, j: integer;
    Flag: boolean;
    curline:word;
begin
  AssignFile(Fz, 'B_z.txt');
  Reset(Fz);
  curline:=0;
  while not Eof(Fz) do
  begin
    flag:=false;
    while (not flag)and(not Eof(Fz)) do
    begin
      readln(Fz, st);
      k:=pos('<zadacha>',st);
      flag := (k<>0);
    end;
    inc(curline);
    Sg_data.RowCount:=Sg_data.RowCount+1;

    while (flag)and(not Eof(Fz)) do
      begin
        readln(Fz, st);
        k:=pos('<zadacha>',st);
        flag := (k<>0);

        Us:='<*uslovie>';
        kUs:='<#'uslovie>;

        k:=Pos(Us, st);
        if k<>0 then
        begin
          readln(Fz, st);
          k1:=Pos(kUs,st);
          while k1=0 do
          begin
            Sg_data.Cells[1, curline] :=Sg_data.Cells[1, curline]+' '+st;
            readln(Fz, st);
            k1:=Pos(kUs,st);
          end;
        end;

        Us:='<uslovie>';
        kUs:='<#uslovie>';
        k:=Pos(Us, st);
        if k<>0 then
        begin
          readln(Fz, st);
          k1:=Pos(kUs,st);
          while k1=0 do
          begin
            Sg_data.Cells[1, curline] :=Sg_data.Cells[1, curline]+' '+st;
            readln(Fz, st);
            k1:=Pos(kUs,st);
          end;
        end;
      end;
  end;
  closefile(fz);
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter