Текущий архив: 2007.09.23;
Скачать: CL | DM;
Внизсравнение строк Найти похожие ветки
← →
sinoptikmoscow © (2007-08-28 18:07) [0]Есть текстовый файл со строками:
Вася
Петя
Ира
Вася
Лена
Ира
Дима
Помогите сделать код, чтобы он искал повторяющиеся строки в файле и удалял их,
допустим нашел поле Ира, сохранил его а последующие строки "Ира" удалял.
← →
TUser © (2007-08-28 18:21) [1]Если файл маленький, то прочитать в стринглист и квадратичным алгоритмом просмотреть, удаляя лишние строки. Потом записать.
Если большое, то так не пойдет. Тогда прочитай про то, что такое суффиксные деревья. Читая файл записываешь каждую строчку в суффиксное дерево, рпедварительно дабавляя к ней фиктивный, отсутствующий в алфавите символ. При появлени новой строчки оценивай, есть ли она в дереве. Если нет, - дабавляем и печатаем. Оценка времени О(число строк*О(длина строки), правда памяти надо О(размер файла).
Если файл совсем большой, то будут тормоза из-за постоянного обращения к различным участкам непомерно большой памяти. В этом случае, дерево должно быть не суффиксным, а бинарным (лучше сбалансированным), и хранить там надо контрольные суммы.
← →
sinoptikmoscow © (2007-08-28 18:29) [2]квадратичным алгоритмом просмотреть, это как ?
← →
Вудди (2007-08-28 18:34) [3]да просто это
← →
umbra © (2007-08-28 18:45) [4]
> квадратичным алгоритмом
он же - метод пузырька
← →
sinoptikmoscow © (2007-08-28 19:15) [5]ну если это так просто, то скиньте если не трудно код к приведенному мною выше примеру, а то я уже замучался
← →
sniknik © (2007-08-28 19:57) [6]
procedure TForm1.Button1Click(Sender: TObject);
var
list: TStringList;
begin
list:= TStringList.Create;
try
list.Sorted:= true;
//list.Duplicates:= dupIgnore; стоит по умолчанию
list.LoadFromFile("D:\txt.txt");
Memo1.Lines.Assign(list);
finally
list.Free;
end;
end;
← →
grisme © (2007-08-28 20:07) [7]это "так" - на вскидочку. :) зы. как понял из сабжа, текст файловый, посему чтение и запись "построчные".
Procedure DoubleCleaner(fpath:String);
var
tf:TextFile;
strings:array of String;
i,j:Integer;
begin
AssignFile(tf, fpath);
Reset(tf);
while (EOF(tf) = FALSE) do
begin
SetLength(strings, Length(strings)+1);
Readln(tf, strings[Length(strings)-1]);
end;
CloseFile(tf);
for i:=0 to Length(strings)-2 do
for j:=i+1 to Length(strings)-1 do
if (strings[j] = strings[i]) then strings[j]:="";
AssignFile(tf, fpath);
Rewrite(tf);
for i:=0 to Length(strings)-1 do
if (strings[i] <> "") then Writeln(tf, strings[i]);
CloseFile(tf);
end;
← →
sinoptikmoscow © (2007-08-28 20:37) [8]to grisme
что-то он отрабатывает но не заменяет, ща посмотрю, может найду bad block
← →
sinoptikmoscow © (2007-08-28 20:57) [9]а, всё заработало !!
СПАСИБО ВСЕМ !!!!!!
особенно grisme )
вы тут все - реальные перцы )
с вами я быстро Delphi изучу ;)
← →
TUser © (2007-08-28 21:24) [10]var SL: TStringList;
i, j: integer;
begin
SL := TStringList.Create;
try
SL.LoadFromFile (...);
for i := SL.Count - 2 downto 0 do
for j := SL.Count - 1 downto i + 1 do
if SL[i] = SL[j] then
SL.Delete (j);
SL.SaveToFile (...);
finally
SL.Free;
end;
end;
← →
Евгений Р. (2007-08-28 23:42) [11]
SL.LoadFromFile (...);
sl.sort;
n:=1;
while n<sl.count do Begin
if sl[n]=sl[n-1] then sl.delete[n]
else inc(n);
End;
← →
TUser © (2007-08-29 00:21) [12]В [0] ничего не сказано о том, что порядок строк можно акким-то образом менять. Значит, нельзя.
← →
Евгений Р. (2007-08-29 01:13) [13]
> В [0] ничего не сказано о том, что порядок строк можно акким-
> то образом менять. Значит, нельзя.
В [0] ничего не сказано о том, что порядок строк менять нельзя. Значит, можно.
А какой порядок в [0]? Вася должен стоять перед Петей или после???
Уверен, что в [10] удалится не тот!
← →
{RASkov} © (2007-08-29 01:24) [14]
procedure DeleteDuplicate(Lb: TStrings);
var N: Integer;
begin
for N:=Lb.Count-1 downto 1 do
if Lb.IndexOf(Lb[N])<>N then Lb.Delete(N);
end;
© ГерманнDeleteDuplicate(LS);
ГдеLS: TStrings;
иLS:=TStringList.Create;
LS.LoadFromFile("ПетиВаси.txt");
....
LS.Free;
← →
Германн © (2007-08-29 02:09) [15]
> {RASkov} © (29.08.07 01:24) [14]
Да ладно. Спасибо, конечно, за копирайт, но пора его забыть. Наверняка я не первый, кто предложил подобный вариант :)
← →
{RASkov} © (2007-08-29 03:20) [16]> [15] Германн © (29.08.07 02:09)
:)
Просто не забываемая ветка та.... столько вариантов.... и этот самый короткий... просто всех сделал :)
> Наверняка я не первый, кто предложил подобный вариант
Ну первый не первый, а вариантов было много... :)
> но пора его забыть.
Ок. Просто больше ставить не буду :)
← →
Германн © (2007-08-29 03:36) [17]
> Ок. Просто больше ставить не буду :)
>
Ну если речь пойдёт о книге Гиннеса, тогда вспомни, пожалуйста!
:)
← →
{RASkov} © (2007-08-29 03:42) [18]> [17] Германн © (29.08.07 03:36)
> тогда вспомни, пожалуйста!
Да я и не говорил, что забуду....
:)
← →
sniknik © (2007-08-29 08:40) [19]> и этот самый короткий... просто всех сделал :)
да ну? посчитай внимательнее.
← →
sinoptikmoscow © (2007-08-29 10:54) [20]я извиняюсь, что встреваю, но порядок строк действительно нельзя менять :)
← →
Anatoly Podgoretsky © (2007-08-29 11:12) [21]А не менять предлагали, а спрашивали какого Васю оставить.
← →
sinoptikmoscow © (2007-08-29 11:30) [22]а если немного изменить условие, вот структура файла:
Имя=Вася
Фамилия
Отчество
Имя=Галя
Фамилия
Отчество
Имя=Оля
Фамилия
Отчество
Имя=Вася
Фамилия
Отчество
Имя=Петя
Фамилия
Отчество
Имя=Галя
Фамилия
Отчество
поиск происходит по строке с именем (по строке Имя=***)
если така же строка находится (допустим "Имя=Галя" = "Имя=Галя", либо "Имя=Вася" = "Имя=Вася", и т.п.)
то он удаляет этот блок до строки "Отчество" (то есть удалить должен строку "Имя=Галя" и строку "Фамилия"). И так до конца файла.
Причем пустые строки между блоками должны сохраняться, строки должны идти в том же порядке, ну только смещаясь вверх, на место удаленных.
Это конечно сложнее, но если кто-нибудь выложит кодик, буду очень благодарен, а если слишком трудно, то забейте
← →
tmp (2007-08-29 11:52) [23]
> sinoptikmoscow © (28.08.07 20:57) [9]
> а, всё заработало !!
> СПАСИБО ВСЕМ !!!!!!
> особенно grisme )
> вы тут все - реальные перцы )
> с вами я быстро Delphi изучу ;)
Да-да, это заметно. Ты бы сначала написал, как видишь ты решение своей задачи и какие при этом проблемы возникли, а уже потом расчитывал на помощь, но не в виде готового кода.
← →
sinoptikmoscow © (2007-08-29 12:14) [24]
> Да-да, это заметно. Ты бы сначала написал, как видишь ты
> решение своей задачи и какие при этом проблемы возникли,
> а уже потом расчитывал на помощь, но не в виде готового
> кода.
ну простите меня ну :.-( хнык хнык, ну не надо мне тогда кода, ничего мне не надо, :.-( хнык, хнык, сам всё сделаю...
← →
Denis_ © (2007-08-29 12:21) [25]Какие времена пошли! Челу на вопрос дали 5 вариантов кода! И них 3 - после того, что он сказал, что всё работает!
← →
sinoptikmoscow © (2007-08-29 12:36) [26]
> Какие времена пошли! Челу на вопрос дали 5 вариантов кода!
> И них 3 - после того, что он сказал, что всё работает!
Да все эти коды работают, точнее 4. Только задача у меня поменялась, см. [22]
← →
Anatoly Podgoretsky © (2007-08-29 12:54) [27]> sinoptikmoscow (29.08.2007 11:30:22) [22]
И получить кучу мусора в виде "Отчество"
← →
Denis_ © (2007-08-29 12:59) [28]
> Это конечно сложнее, но если кто-нибудь выложит кодик, буду
> очень благодарен, а если слишком трудно, то забейте
А самому лень что - ли сделать? месяца 2 назад тебя сказали бы про хелп, кривые руки, гугл, яндекс и тп.
А сейчас даже мастера тебе код дают, тк посещаемость падает...
А им всё кодик...
← →
sniknik © (2007-08-29 13:00) [29]> Только задача у меня поменялась, см. [22]
значит надо немного подождать когда она ещё раз измениться...
вернётся к старому и ничего делать не придётся, "расширится" тогда придётся переделывать все на базы... и в том и в том варианте нынешнее решение будет только потерей времени.
← →
sniknik © (2007-08-29 13:02) [30]> тк посещаемость падает...
вот уж не поэтому..., читай "прочее" там писали что она для них значит эта посещаемость.
скорее ему просто повезло.
← →
sinoptikmoscow © (2007-08-29 13:11) [31]
> значит надо немного подождать когда она ещё раз измениться.
> ..
уже не измениться
> скорее ему просто повезло.
в чем повезло?
> А самому лень что - ли сделать? месяца 2 назад тебя сказали
> бы про хелп, кривые руки, гугл, яндекс и тп.
ну у меня времени нет просто, на работе я, постоянно дергают бухгалтера там и т.п.,
> А сейчас даже мастера тебе код дают, тк посещаемость падает.
> ..
СПАСИБО огромное всем, кто мне помогал и коды давал, очень помогло !!! Реально СПАСИБО от души !
← →
Denis_ © (2007-08-29 13:15) [32]
> в чем повезло?
В том, что код тебе сразу дали. Я ж тебе говорю : никогда таково не было, чтоб код 5 раз давали.
> вот уж не поэтому..., читай "прочее" там писали что она
> для них значит эта посещаемость.
Писать одно дело, а на деле форум изменился. Бывало на 15-20 минут отойдёшь, а тем уже сменились.А сейчас - тишь да гладь.
← →
sniknik © (2007-08-29 13:21) [33]> А сейчас - тишь да гладь.
а вот подожди пока студенты рефераты не начнут сдавать...
← →
Anatoly Podgoretsky © (2007-08-29 13:28) [34]> sinoptikmoscow (29.08.2007 13:11:31) [31]
> ну у меня времени нет просто
У нас тоже
← →
Anatoly Podgoretsky © (2007-08-29 13:28) [35]> sniknik (29.08.2007 13:21:33) [33]
А еще лучше до первых лабораторных
Но судя по форуму это уже началось.
Страницы: 1 вся ветка
Текущий архив: 2007.09.23;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.043 c