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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 10:19   #1
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию удаление совпадающих строк

Здравствуйте. Подскажите, как можно удалить совпадающую (или совпадающие) с какой либо строкой строку в txt файле? Смысл в том, чтоб в этом файле все строки были различны.
Структура самого файла такая:
122
877
126
и т.д., общее к-во строк неизвестно.
Потом в проге у меня идет суммирование в переменную s: readln(f1,n); s=s+strtoint(n);
Даже пусть совпадающие строки не удаляются из файла, а просто не входят в суммирование.

Последний раз редактировалось varelik; 18.03.2010 в 10:56.
varelik вне форума Ответить с цитированием
Старый 18.03.2010, 10:27   #2
quit
Я есть!
Форумчанин
 
Аватар для quit
 
Регистрация: 17.02.2008
Сообщений: 318
По умолчанию

перебором, иначе никак..
©Учиться, учиться и еще раз учиться!
quit вне форума Ответить с цитированием
Старый 18.03.2010, 10:36   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сразу скажу, писал здесь, быстро и не проверяя!
отладку/исправление ошибок доверяю Вам!

Код:
var TS1, TS2 : TStringList;
  i : integer;
begin
  TS1 := TStringList.Create;
  TS2 := TStringList.Create;
  try
    TS1.LoadFromFile('ВашФайл.txt');
    for i:=0 to  TS1.Count-1 do
       if TS2.IndexOf(TS1.Lines[i])<0 then  TS2.Add(TS1.Lines[i]);
    TS2.SaveToFile('НовыйФайл.txt);
  finally
    FreeAndNil(TS1);
    FreeAndNil(TS2);
  end;

end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2010, 10:39   #4
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию

Serge_Bliznykov, спасибо, но не совсем то, я изначально вопрос неверно поставил, см поправку.

Последний раз редактировалось varelik; 18.03.2010 в 10:55.
varelik вне форума Ответить с цитированием
Старый 18.03.2010, 10:52   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я бы через ODBC подключил этот фал как базу данных, и уже простым запросом обработал его. Впрочем это Лирика.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2010, 11:00   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
   
  var
   TS1: TstringList;
    j,k: integer;
   s: string;

   TS1:=TstringList.Create;
    TS1.LoadFromFile('ВашФайл.txt'); // читаем файл  в список строк
    for i:=TS1.Count-1 downto 0 do //просматриваем список с конца
    begin
       s:=TS1.string[j];// берем по строчке с конца
       k:=TS1.IndexOf(s); //ищем такую же строчку с начала
// мы ее всегда найдем не позже чем j (т.е. всегда найдем себя)
// но можем найти и раньше 
       if k<>j // если номера строк с начала и с конца разные
         then TS1.Delete(j). // удаляем последнюю
       esle //суммируем прошедшие проверку 
         sum:=sum + strtoint(s); 
   end;
//    TS1.SaveToFile('НовыйФайл.txt);//сохраняем список в новый файл
   TS1.Free;
P.S.выделено если надо суммировать
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.03.2010 в 11:16.
evg_m вне форума Ответить с цитированием
Старый 18.03.2010, 11:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а какая разница?!
можно (это будет эффективно), использовать тот же подход
Код:
var TS1, TS2 : TStringList;
  i, s : integer;
begin
  TS1 := TStringList.Create;
  TS2 := TStringList.Create;
  try
    TS1.LoadFromFile('ВашФайл.txt');
    for i:=0 to  TS1.Count-1 do
       if TS2.IndexOf(TS1.Strings[i])<0 then  TS2.Add(TS1.Strings[i]);
     // теперь в TS2 только РАЗНЫЕ строчки

     //   теперь суммируем
     s:=0;
     for i:=0 to TS2.Count-1 do
         s := s + strtoint(TS2.Strings[i]);
     Application.MessageBox(PChar('сумма равна '+IntToStr(s)),'Отладка', MB_OK);
  finally
    FreeAndNil(TS1);
    FreeAndNil(TS2);
  end;
end;

Последний раз редактировалось Serge_Bliznykov; 18.03.2010 в 11:07.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2010, 16:06   #8
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию

спасибо, а как читать строки из stringlist?:
строки из txt считываю так: while not eof(f1) do readln(f1,n);
есть ли аналогичная команда для строк stringlist типа readln(ts1,n)?

дело в том, что на самом деле не строки должны суммироваться, а символы строк с 4 по 7 например. Вот так не выходит:

Код:
f,sum:string;
...
for i:=0 to ts1.Count-1 do
sum:=ts1.strings[i];
f:= sum[4]+sum[5]+sum[6]+sum[7];

Последний раз редактировалось varelik; 19.03.2010 в 11:47.
varelik вне форума Ответить с цитированием
Старый 20.03.2010, 21:57   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

f:= sum[4]+sum[5]+sum[6]+sum[7];
можно, но надо быть уверенным что длина каждой строки будет>=8
иначе будет ошибка

f:=copy(sum,4,4);
а можно и так в этом случае при короткой строке ( менее 8 знаков) скопированы будут толькр имееющиеся символы т.е. длина строки f будет <4 но ошибки не будет.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление строк alexk Microsoft Office Excel 24 15.02.2011 08:34
Поиск и удаление совпадающих строк в разных листах hybrid84 Microsoft Office Excel 11 24.07.2009 05:13
Удаление строк из Memo Leksda Общие вопросы Delphi 6 20.03.2009 15:31
Удаление строк Dr.Badnezz Общие вопросы Delphi 1 07.10.2008 15:22
удаление строк Dime_x Microsoft Office Excel 2 07.10.2008 13:38