Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2009, 14:33   #1
lg12
Пользователь
 
Регистрация: 20.06.2009
Сообщений: 50
По умолчанию работа со строками

У меня есть огромный файл(большое кол-во строк). я его загружаю в мемо. Подскажите, как загружать эти строчки в массив. И можно ли сделать так чтобы потом проверять есть ли в этой строке нужное мне слово
lg12 вне форума Ответить с цитированием
Старый 16.08.2009, 14:42   #2
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

можно так
Код:
var S:TStringList; i:integer;
begin
S:=TStringList.Create;
S.Text:=Memo1.Text;
for i:=0 to S.Count-1 do
begin
if pos('то что ищим', S.Strings[i])<>0 then Form1.Caption:='Строка '+inttostr(i);
break;
end;
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]

Последний раз редактировалось MaTBeu; 16.08.2009 в 22:31.
Volt вне форума Ответить с цитированием
Старый 16.08.2009, 14:49   #3
lg12
Пользователь
 
Регистрация: 20.06.2009
Сообщений: 50
По умолчанию

Код:
n:=Memo1.Lines.Count;
Setlength(a,n);
for i:=0 to n-1 do
 begin
   s:=Memo1.Lines.Strings[i];
как то с этим можно что нибудь сделать

Последний раз редактировалось MaTBeu; 16.08.2009 в 22:31.
lg12 вне форума Ответить с цитированием
Старый 16.08.2009, 15:08   #4
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

Код:
var i:integer;
begin
Memo1.Text;
for i:=0 to memo1.Lines.Count-1 do
begin
if pos('то что ищим', Memo1.Lines.Strings[i])<>0 then Form1.Caption:='Строка '+inttostr(i);
break;
end;
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]

Последний раз редактировалось MaTBeu; 16.08.2009 в 22:31.
Volt вне форума Ответить с цитированием
Старый 16.08.2009, 15:12   #5
lg12
Пользователь
 
Регистрация: 20.06.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Volt Посмотреть сообщение
var i:integer;
if pos('то что ищим', Memo1.Lines.Strings[i])<>0 then Form1.Caption:='Строка '+inttostr(i);
спасибо. можно только комментарий к коду

код действительно рабочий. но как быть если такая строчка не одна, а несколько? например файл содержит данные:
привет
привет
привет
привет
как отредактировать код чтобы он выводил все строки где встречается данное слово

Последний раз редактировалось Stilet; 17.08.2009 в 08:19.
lg12 вне форума Ответить с цитированием
Старый 16.08.2009, 15:57   #6
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

убирите break;
if pos('то что ищим', Memo1.Lines.Strings[i])<>0 then
memo2.Lines.Add('Строка '+inttostr(i))

Функция Pos находит позицию одной строки Needle в другой строке HayStack.Если строка не найдена, возвращается 0.Поиск чувствителен к регистру.
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]

Последний раз редактировалось Volt; 16.08.2009 в 16:10.
Volt вне форума Ответить с цитированием
Старый 16.08.2009, 19:10   #7
lg12
Пользователь
 
Регистрация: 20.06.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Volt Посмотреть сообщение
memo2.Lines.Add('Строка '+inttostr(i)).
я хочу работать дальше с найдеными строками. например сделать еще один поиск в найденной строке. ниче толкого сам придумать не могу

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

Последний раз редактировалось Stilet; 17.08.2009 в 08:19.
lg12 вне форума Ответить с цитированием
Старый 17.08.2009, 08:20   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как от I получить номер строки.
memo2.Lines[i] даст i-тую строку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.08.2009, 10:07   #9
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

может тебе обычный поиск нужен то вот
Цитата:
function FindInMemo(Memo: TMemo; const FindText: string;
FindDown, MatchCase: Boolean): Boolean;

{Если строка найдена, то результат True, иначе - False;

FindText : искомая строка;
FindDown : True - поиск вниз от курсора ввода;
False - поиск вверх от курсора ввода;
MatchCase : True - с учетом регистра букв,
False - не учитывая регистр бук.

Если у Memo стоит автоперенос слов, то могут
возникнуть проблемы - текст будет найден,
но выделен не там где надо. Так что, для нормального поиска
свойство ScrollBars у Memo ставить в ssBoth (ну или ssHorizontal)}

function PosR2L(const FindStr, SrcStr: string): Integer;
{Поиск последнего вхождения подстроки FindStr в строку SrcStr}
var
ps, L: Integer;

function InvertSt(const S: string): string;
{Инверсия строки S}
var
i: Integer;
begin
L := Length(S);
SetLength(Result, L);
for i := 1 to L do
Result[i] := S[L - i + 1];
end;

begin
ps := Pos(InvertSt(FindStr), InvertSt(SrcStr));
if ps <> 0 then
Result := Length(SrcStr) - Length(FindStr) - ps + 2
else
Result := 0;
end;

function MCase(const s: string): string;
{Перевод заглавных букв в строчные;
Функция вызывается если регистр не учитывается}
var
i: Integer;
begin
Result := s;
for i := 1 to Length(s) do
begin
case s[i] of
'A'..'Z',
'А'..'Я': Result[i] := Chr(Ord(s[i]) + 32);
'Ё': Result[i] := 'ё';
'Ѓ': Result[i] := 'ѓ';
'Ґ': Result[i] := 'ґ';
'Є': Result[i] := 'є';
'Ї': Result[i] := 'ї';
'І': Result[i] := 'і';
'Ѕ': Result[i] := 'ѕ';
end;
end;
end;

var
Y, X, SkipChars: Integer;
FindS, SrcS: string;
P: TPoint;
begin
Result := False;

if MatchCase then
FindS := FindText
else
FindS := MCase(FindText);

P := Memo.CaretPos;

if FindDown then
{Поиск вправо и вниз от курсора ввода}
for Y := P.y to Memo.Lines.Count do
begin

if Y <> P.y then
{Если это не строка, в которой курсор вода,
то ищем во всей строке}
SrcS := Memo.Lines[Y]
else
{иначе обрезаем строку от курсора до конца}
SrcS := Copy(Memo.Lines[Y], P.x + 1,
Length(Memo.Lines[Y]) - P.x + 1);

if not MatchCase then
SrcS := MCase(SrcS);
X := Pos(FindS, SrcS);
if X <> 0 then
begin
if Y = P.y then
Inc(X, P.x);
P := Point(X, Y);
Result := True;
Break; {Выход из цикла}
end
end
else
{Поиск влево и вверх от курсора ввода}
for Y := P.y downto 0 do
begin

if Y <> P.y then
{Если это не строка, в которой курсор вода,
то ищем во всей строке}
SrcS := Memo.Lines[Y]
else
{иначе обрезаем строку от начала до курсора
минус выделенный текст}
SrcS := Copy(Memo.Lines[Y], 1, P.x - Memo.SelLength);

if not MatchCase then
SrcS := MCase(SrcS);
X := PosR2L(FindS, SrcS);
if X <> 0 then
begin
P := Point(X, Y);
Result := True;
Break; {Выход из цикла}
end
end;

if Result then
begin
{Если текст найден - выделяем его}
SkipChars := 0;
for y := 0 to P.Y - 1 do
Inc(SkipChars, Length(Memo.Lines[y]));
Memo.SelStart := SkipChars + (P.Y * 2) + P.X - 1;
Memo.SelLength := Length(FindText);
end;
end;
Пример использования:

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
if not FindInMemo(Memo1,
FindDialog1.FindText,
frDown in FindDialog1.Options,
frMatchCase in FindDialog1.Options) then
Application.MessageBox('Поиск результатов не дал.',
PChar(Application.Title),
MB_OK or MB_ICONINFORMATION);
end;
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со строками buba3230 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 02.06.2009 22:18
Работа со строками. ViNcHeStEr Помощь студентам 6 29.06.2008 08:14
С, работа со строками Надюха Помощь студентам 2 29.05.2008 13:07
Работа со строками . Cveto4eg Помощь студентам 11 26.05.2008 13:36
[С++]работа со строками Федор Помощь студентам 6 23.12.2007 12:35