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

Вниз

Вопрос чайника....   Найти похожие ветки 

 
Кирилка   (2002-10-21 16:53) [0]

Уважаемые Мастера,
Есть текстовый файл, данные разбиты по колонкам. Как определить встречается ли часть строки в других строках.
Спасибо за помощь.


 
MBo ©   (2002-10-21 17:00) [1]

функции Сopy и Pos


 
PVOzerski ©   (2002-10-21 17:01) [2]

Из хелпа:
function Pos(Substr: string; S: string): Integer;

Description

Pos searches for a substring, Substr, in a string, S. Substr and S are string-type expressions.
Pos searches for Substr within S and returns an integer value that is the index of the first character of Substr within S. Pos ignores case-insensitive matches. If Substr is not found, Pos returns zero.


 
Кирилка   (2002-10-21 17:46) [3]

Понял, спасибо.
А как в цикле по всему файлу сделать поиск ?
Нужно взять часть строки из первой строки и сделать поиск по всему файлу, потом взять часть второй строки и сделать поиск и так до конца файла. Что-то никать не соображу.
Спасибо за помощь.


 
Кирилка   (2002-10-21 22:57) [4]

Пожалуйста, помогите!
А как в цикле по всему файлу сделать поиск ?
Нужно взять часть строки из первой строки и сделать поиск по всему файлу, потом взять часть второй строки и сделать поиск и так до конца файла. Что-то никать не соображу.
Спасибо за помощь.


 
MBo ©   (2002-10-22 07:08) [5]

Используй TStringList (LoadFromFile и т.д.)
Ты не уточнил, как именно организовано разбиение по колонкам.
Проще всего, если "слова" разделены пробелами или запятыми.
Тогда вспомогательный
StringList2.Commatext:=MainList[i]
и в каждой его строке будет отдельное слово.
Если же в подстроках могут быть пробелы, но сами они постоянной ширины, удобнее просто использовать Copy


 
turusov ©   (2002-10-22 10:23) [6]

type
TNsSel = record
SelStart: integer;
SelLength: integer;
end;
//Найти и заменить
function SearchNext(RE: TRichEdit; const FindText: string; Options: TSearchTypes;
Font: TFont; Replace: boolean = False; NotFoundStop: boolean = False): TNsSel;//Не найдено останавливать
var
FoundAt: integer; //Не забудте сместить SelStart на Length(FindText)
begin
Result.SelStart:= -1;
Result.SelLength:= 0;
FoundAt:= RE.FindText(FindText,RE.SelStart{+Length(FindText)},
Length(RE.Text)-RE.SelStart,Options);
if FoundAt < 0 then begin
if NotFoundStop then begin
MessageBox(Application.Handle, PChar(Format("Строки: ""%s"" больше не найдено.",
[FindText])), PChar("Поиск"), MB_OK OR MB_ICONINFORMATION);
end;//if
// Exit;
end;//if
Result.SelStart:= FoundAt;
Result.SelLength:= Length(FindText);

if Replace then
with RE.SelAttributes do begin
RE.SelStart:= FoundAt;
RE.SelLength:= Length(FindText);
Color:= Font.Color;
Name:= Font.Name;
Pitch:= Font.Pitch;
Size:= Font.Size;
Style:= Font.Style;
end;
end;


 
Кирилка   (2002-10-22 11:00) [7]

Честно говоря знаний не хватает, чтобы в этом разобраться. Никак проще это нельзя сделать или прошу объяснить во строкам.
Буду очень благодарен.


 
Alx2 ©   (2002-10-22 11:26) [8]

>Кирилка (22.10.02 11:00)
Опиши задачу подробнее. Что тебе даст знание о том, что какая-то строка встречается еще раз? От конечной цели зависит и реализация. Если просто любопытно определение самого факта повтора - можно весь файл закатать в одну строку и осуществлять по ней поиск с заданной позиции.


 
turusov ©   (2002-10-22 11:29) [9]

FindText-метод TRichEdit(RE.)
try//Загружаем файл как текст
RE.Clear; //первоначально чистим
RE.PlainText:= True;//устанавливаем, чтобы как в TMemo
RE.Lines.LoadFromFile(FileName);//грузим
finally
RE.PlainText:= False;//возвращаемся к возможностям TRichEdit
RE.Modified:= False;//как будто не меняли
end;
RE.FindText(FindText,//искомый текст в выделенном участке Sel
RE.SelStart, //начало веделенного участка
Length(RE.Text)-RE.SelStart,//его размер
Options); //искать ключевые слова, учитывать регистр
Result.SelStart:= FoundAt; //запоминаем для продолж.поиска
Result.SelLength:= Length(FindText);
if Replace then //если хочешь, чтобы производилось выделение найденного


 
turusov ©   (2002-10-22 11:32) [10]

Alx2
TStrings имеет Text


 
Дед Макар   (2002-10-22 11:37) [11]


> Alx2 © (22.10.02 11:26)
> Опиши задачу подробнее. Что тебе даст знание о том, что
> какая-то строка встречается еще раз? От конечной цели зависит
> и реализация.

Видимо, конечная цель - сдать лабу или курсовик :)
Еще десяток советов и обязательно будет "Че-то вы меня совсем запутали :( Намыльте пж, исходник со всеми dfm и dpr файлами". Просто сразу такое писать стыдно, а вот сделать вид, что читаешь советы и пытаешься в них разобраться - время позволяет...


 
Alx2 ©   (2002-10-22 11:38) [12]

>turusov © (22.10.02 11:32)
Сначала разрулим файл на строки в StringListe а потом снова сколотим строки вместе, чтобы взять Text? ИМХО крайне нерационально.


 
turusov ©   (2002-10-22 11:42) [13]

Alx2 - согласен


 
Alx2 ©   (2002-10-22 11:44) [14]

>Дед Макар (22.10.02 11:37)

Злой ты, дед :)) Но, может быть и прав в этом.


 
Кирилка   (2002-10-22 12:03) [15]

Описываю подробнее.
Есть текстовый файл. Приблизительный формат:

Устройство1 ! Параметр1 ! Параметр2 ! параметр3 !
Устройство2 ! Параметр1 ! Параметр2 ! параметр3 !

Нужно выбрать кусок строки , к примеру с 14 по 24 символ, сделать поиск по всем строкам на предмет наличия такого же куска строки( параметра). Если совпадение найдено, то строку, где найдено совпадение вывести в файл. Таким образом хочется определиться , есть ли двойные записи по параметрам.


 
Alx2 ©   (2002-10-22 12:15) [16]

>Кирилка (22.10.02 12:03)
Тогда действительно TStringList.
Загружаешь свой файл туда, через CustomSort сортируешь по нужному параметру (Duplicates при этом = dupAccept) и смотришь на предмет соседних одинаковых (по сортируемому параметру) записей. Так будет быстрее, чем каждый раз рыскать по файлу в поисках похожестей (сложность O(n*log2(n)) супротив O(n^2)). Да и сразу всю информацию по дубликатам получишь.


 
Alx2 ©   (2002-10-22 13:05) [17]

>Кирилка (22.10.02 12:03)
Чего-то замолчал :)


procedure TForm1.Button3Click(Sender: TObject);
function ExtractParam(const S: string): string;
begin
Result := Copy(S, 14, 24 - 14 + 1); //Нужно выбрать кусок строки , к примеру с 14 по 24 символ
end;

function MySort(List: TStringList; Index1, Index2: Integer): Integer;
var S1, S2: string;
begin
S1 := ExtractParam(List[Index1]);
S2 := ExtractParam(List[Index2]);
if S1 < S2 then Result := -1 else
if S1 > S2 then Result := 1 else
Result := 0;
end;

var
Str: TStringList;
k, Start: integer;
S, TmpS: string;
begin
Str := TStringList.Create;
try
Str.LoadFromFile(твой файл);
Str.Duplicates := dupAccept;
Str.CustomSort(MySort);
if Str.Count > 1 then
begin
S := ExtractParam(Str[0]);
TmpS := S;
k := 1;
repeat
Start := k;
while (k < Str.Count) and (S = Tmps) do
begin
TmpS := ExtractParam(Str[k]);
inc(k);
end;
Start := k - Start;
if TmpS = S then inc(Start);
if Start > 1 then
Memo1.Lines.Add(Format("Для параметра [%S] обнаружено дубликатов: %d", [S, Start]));
S := TmpS;
until k >= Str.Count;
end;
finally
Str.Free;
end;
end;


В этом примере Str хранит все данные из файла. Хотя выгоднее (именно в этом примере) там держать уже кастрированные строки и сортировать их через стандартный Sort, а не через CustomSort.
Но я оставил пример в этом виде. Вдруг нужна точная инфа об устройствах- дубликатах? Она элементарно восстанавливается.


 
Alx2 ©   (2002-10-22 13:10) [18]

Да, еще забыл поправить:
Вот это
Str.CustomSort(MySort);
замени на это:
Str.CustomSort( @MySort);


 
Кирилка   (2002-10-22 13:32) [19]

Огромное СПАСИБО за помощь,всем!!!!



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

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

Наверх




Память: 0.52 MB
Время: 0.012 c
6-101414
Malder
2002-08-29 18:45
2002.10.31
Как послать пактеты именно по данному интерфейсу ?


1-101252
asdfghqwert
2002-10-21 16:13
2002.10.31
Как сделать фон (битмап) в listbox и на Button?


1-101332
Vladislav
2002-10-20 17:54
2002.10.31
Абсолютные координаты визуального компонента


3-101107
ValSam
2002-10-09 17:41
2002.10.31
Oracle ->MSSQL


1-101289
Weare
2002-10-22 10:43
2002.10.31
Необходимо конструктивное решение