Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.023 c
15-1188109001
norman
2007-08-26 10:16
2007.09.23
планировщик


15-1187551145
Petr V. Abramov
2007-08-19 23:19
2007.09.23
Будет ли Куба "островом демократии"


1-1184231813
Phoenix
2007-07-12 13:16
2007.09.23
rtf файлы и колонтитулы.


2-1188548482
Sonia
2007-08-31 12:21
2007.09.23
RadioGroup


15-1187801365
ferr
2007-08-22 20:49
2007.09.23
Бука.