Главная страница
    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.53 MB
Время: 0.043 c
1-1184231629
Makhanev Alexander
2007-07-12 13:13
2007.09.23
TStringList между потоками...


2-1188365984
DimOk
2007-08-29 09:39
2007.09.23
Системный трей


15-1187758204
de.
2007-08-22 08:50
2007.09.23
PHP and MS SQL Server


15-1188156848
Dik59
2007-08-26 23:34
2007.09.23
Странности с установкой RX-компонент


11-1171855380
ebz
2007-02-19 06:23
2007.09.23
Unicode Control





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский