Текущий архив: 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.01 c