Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2009, 22:12   #1
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
Сообщение Удаление пустых и повторяющихся строк

Всем доброго времени суток.

Есть необходимость удалять все повторяющиеся и пустые строки в текстовом файле, подскажите кто-нибудь как это можно сделать.

Пробывал вот так не получилось:
Код:
var
  i: integer;
  Find: string;
begin
  Find:='';
  Memo1.Lines.LoadFromFile('1.txt');
  for i:=0 to Memo1.Lines.Count-1 do
    If Pos(FIND, Memo1.Lines.Text)<>0 Then
    Begin
      Memo1.Lines.Clear;
    End;
  Memo1.Lines.SaveToFile('1.txt');
end;
И так тоже не получилось:
Код:
var
  i: integer;
begin
  Memo1.Lines.LoadFromFile('1.txt');
  for i:=0 to Memo1.Lines.Count-1 do
  if Memo1.Lines.Text='' then  
    Begin
      Memo1.Lines.Clear;
    End;
  Memo1.Lines.SaveToFile('1.txt');
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 02.12.2009 в 22:21.
Marsel737 вне форума Ответить с цитированием
Старый 02.12.2009, 22:20   #2
Voody
Форумчанин
 
Регистрация: 22.06.2009
Сообщений: 310
По умолчанию

алгоритм (на горА):
1) в StringList-1 загоняем исходные строки
2) берем по очереди строки из StringList-1:
а) если пустая, берем следующую
б) если не пустая, то смотрим, есть ли такая строка в StringList-2. если есть, то берем следующую
в) если такой строки в StringList-2 нет, то записываем ее туда
3) повторяем до конца StringList-1

Такой алгоритм обрабатывает 100 тыс. строк ~ за 25 секунд
Voody вне форума Ответить с цитированием
Старый 02.12.2009, 22:23   #3
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Voody, спс за подсказку, если не сложно примерный код не могли бы представить?
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 03.12.2009, 00:20   #4
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Ну скажем так...

Код:
procedure DelClearStr(memo : TMemo);
var
  i : integer;
  bufstr : string;
begin
  i := 0;
  while i <= memo.lines.count - 1 do
  begin
    bufstr := memo.lines.strings[i];
    bufstr := trim(bufstr);
    if length(bufstr) <= 0 then
    memo.lines.delete(i)
    else
    inc(i);
  end;
end;
а насчёт повторяющихся строк сча соображу... чё нить получше. Соображать не буду... А нито тут мне глаза открыли, оказывается сейчас оператива измеряется гигами

Цитата:
1) в StringList-1 загоняем исходные строки
2) берем по очереди строки из StringList-1:
а) если пустая, берем следующую
б) если не пустая, то смотрим, есть ли такая строка в StringList-2. если есть, то берем следующую
в) если такой строки в StringList-2 нет, то записываем ее туда
3) повторяем до конца StringList-1
не хорошо так делать, быстро (не всегда, но в большинстве случаев), но не экономично. эх... застали бы вы те времена, когда кодеры каждый байт экономили...
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.

Последний раз редактировалось notHaker; 03.12.2009 в 01:00.
notHaker вне форума Ответить с цитированием
Старый 03.12.2009, 00:52   #5
Voody
Форумчанин
 
Регистрация: 22.06.2009
Сообщений: 310
По умолчанию

Цитата:
Сообщение от notHaker Посмотреть сообщение
не хорошо так делать, быстро (не всегда, но в большинстве случаев), но не экономично. эх... застали бы вы те времена, когда кодеры каждый байт экономили...
а что экономить. не так уж и много жрет этот код. сейчас в компьютерах гигабайты памяти, а вы хотите экономить пару мегабайт))
как раз мне кажется, в такой задаче важно время выполнения


вот код (кнопку делал в своей программе для такой функции):

Код:
procedure TForm1.ClearButtonClick(Sender: TObject);
var Accounts, AccountsNew:TStringList;
    i:integer;
begin
 Accounts:=TStringList.Create;
 Accounts.LoadFromFile('accounts.txt');

 AccountsNew:=TStringList.Create;

 for i := 0 to Accounts.Count-1 do
   if (Accounts[i]<>'') and (AccountsNew.IndexOf(Accounts[i])=-1) // если строка не пустая и ее нет в AccountsNew, то добавляем ее туда
   then  AccountsNew.Add(Accounts[i]);

 AccountsNew.SaveToFile('new.txt');  
 Accounts.Free;
 AccountsNew.Free;
end;
Voody вне форума Ответить с цитированием
Старый 03.12.2009, 00:58   #6
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Всем большое спасибо, реально помогли
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление пустых строк в таблице Semen90 Microsoft Office Word 24 14.07.2022 12:28
МАКРОС НА ПОИСК, СУММИРОВАНИЕ И УДАЛЕНИЕ ПОВТОРЯЮЩИХСЯ СТРОК provodnikam Microsoft Office Excel 14 19.02.2015 07:53
Поиск значений и удаление пустых строк OgE®_M@G Microsoft Office Excel 12 16.12.2009 20:37
Заполнение пустых строк.. Balina Microsoft Office Excel 9 02.12.2009 11:49
Удаление "повторяющихся" строк zzz007 Microsoft Office Excel 2 03.09.2009 05:01