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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2017, 17:17   #1
andrey1234
 
Регистрация: 05.03.2014
Сообщений: 3
По умолчанию Сравнить строки между собой в txt документе

Всем доброго времени суток. Помогите пожалуйста решить проблему. Имеется текстовый документ, который выглядит следующим образом:

Код:
55001.002      0.000     0.000     0.000     0.000     0.000     0.000 
55002.002      0.000     0.000     0.000     1.050     0.600     0.050 
55003.002      0.015     0.000     0.000     0.000     0.000     0.000 
55004.002      0.000     0.000     0.011     0.000     0.000     0.000 
55005.002      0.000     0.000     0.000     0.000     0.000     0.600 
55006.002      1.030     2.050     4.040     1.060     1.060     1.050 
55007.002      1.030     0.040     3.010     1.060     0.070     1.050 
55008.002      0.000     0.000     0.000     0.000     0.000     0.000 
55009.002      4.650     1.132     2.002     1.001     4.041     3.004 
55010.002      0.000     0.000     0.012     0.566     0.000     0.000
и т.д. Необходимо удалить те строки, в которых присутствует значение 0.000 и одинаковые значения в столбцах с предыдущей строкой, то есть из приведенного примера должна остаться только одна строчка:

Код:
55009.002      4.650     1.132     2.002     1.001     4.041     3.004
Удаление нулей я сделал, но вот строки, которые частично совпадают не могу удалить, делаю так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
 F1, F2: TStringList;
 i: integer;
 tmp: string;
 begin
  F1 := TStringList.Create;
  try
  F2 := TStringList.Create;
  try
  F1.LoadFromFile('file1.txt');
  for i := 0 to F1.Count - 1 do
  begin
    tmp := F1[i];
    if F2.IndexOf(tmp) = -1 then
    F2.Add(tmp);
  end;
  F2.SaveToFile('file2.txt');
  finally
  F2.Free;
 end;
 finally
 F1.Free;
 end;
 end;
Но т.к. строки не полностью совпадают, соответственно удаление не происходит. Как сравнить строки по столбцам между собой и удалить строки, если значение в столбце совпадает с предыдущей строкой? Спасибо



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 15.06.2017 в 22:43.
andrey1234 вне форума Ответить с цитированием
Старый 14.06.2017, 17:34   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Цитата:
Сообщение от andrey1234 Посмотреть сообщение
Необходимо удалить те строки, в которых присутствуют одинаковые значения в столбцах с предыдущей строкой, то есть из приведенного примера должна остаться только одна строчка
А что, если найдутся например у 1-й и 2-й, то надо удалять обе строки ( и 1 и 2 )?
Почему же одна осталась?

А по теме - надо пробегать по всем столбам, и сравнивать с помощью
AnsiMidStr(F1[и], ...
Может и проще есть способ, не знаю.
type_Oleg вне форума Ответить с цитированием
Старый 14.06.2017, 17:37   #3
andrey1234
 
Регистрация: 05.03.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
А что, если найдутся например у 1-й и 2-й, то надо удалять обе строки ( и 1 и 2 )?
Почему же одна осталась?

А по теме - надо пробегать по всем столбам, и сравнивать с помощью
AnsiMidStr(F1[и], ...
Может и проще есть способ, не знаю.
Вопрос немого дополнил и да, если хотя бы в одном столбце значения совпадают, то эти строки нужно удалить

Последний раз редактировалось andrey1234; 14.06.2017 в 17:45.
andrey1234 вне форума Ответить с цитированием
Старый 15.06.2017, 20:21   #4
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Так. Есть строка n1 c 7 столбцами и строка n2 с 7 столбцами.
Если хоть одна запись n2(№ Столбца) будет найдена в массиве n1[столбцы 1-7]
считаем что n2 нам не подходит.
Вам это надо?
Пишу много и развернуто
Heneken87 вне форума Ответить с цитированием
Старый 18.06.2017, 20:44   #5
andrey1234
 
Регистрация: 05.03.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
Так. Есть строка n1 c 7 столбцами и строка n2 с 7 столбцами.
Если хоть одна запись n2(№ Столбца) будет найдена в массиве n1[столбцы 1-7]
считаем что n2 нам не подходит.
Вам это надо?
Если запись n2(№ Столбца) будет найдена в массиве n1[в том же столбце], то все эти строки нам не подходят

Последний раз редактировалось andrey1234; 18.06.2017 в 23:43.
andrey1234 вне форума Ответить с цитированием
Старый 19.06.2017, 09:42   #6
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Код:
procedure Button1Click(Sender: TObject);
const
  MaskColumn: string = '      ';
  ArIskl: array [0 .. 0] of string = ('0.000');
var
 FListStart: TStringList;
 FListRow1: TStringList;
 FListRow2: TStringList;
 FListResult: TStringList;
 j, RowS: integer;
 ResultBool: Boolean;
begin
  try
    FListStart := TStringList.Create;
    FListRow1 := TStringList.Create;
    FListRow2 := TStringList.Create;
    FListResult := TStringList.Create;
    FListResult.Clear;
    FListStart.LoadFromFile('D:\1.txt');
    RowS := 0;
    while pos('  ',FListStart.Text) <> 0 do   { Приводим к виду для использования разделителя}
    FListStart.Text := StringReplace(FListStart.Text,'  ',' ',[rfReplaceAll]);
    while RowS <= FListStart.Count - 1 do
    begin
      ResultBool := False; { Обнуляем переменную }
      FListRow1.Delimiter := ' '; { Разделитель }
      FListRow2.Delimiter := ' '; { Разделитель }
      FListRow1.DelimitedText := FListStart[RowS];
      FListRow2.Text := '';
      { Проверка добавляемой строки на наличие исключений }
      for j := 0 to FListRow1.Count - 1 do
        if MatchStr(FListRow1[j],ArIskl)  then
        ResultBool := True;
      { Исключений НЕТ}
      if ResultBool = False then
      begin
        ResultBool := False; { Обнуляем переменную }
        if RowS <> (FListStart.Count - 1) then
        FListRow2.DelimitedText := FListStart[RowS + 1]; { Берем следующую строку, если она есть}
        { сравниваем строки }
        if FListRow2.Count > 0 then
        for j := 0 to FListRow1.Count - 1 do
        if (FListRow1[j] = FListRow2[j]) then
        begin
          ResultBool := True;
          Break;
        end;
        { Все условя соблюдены, добавляем в результат}
        if ResultBool = False then
          FListResult.Add(FListStart[RowS]);
        RowS := RowS + 1; { Увеличиваем на 1, чтобы не сравнивать следующую строку после добавленой!!! Тут есть ньюанс! 
   Если этого не делать то ПО добавит  строку с 55007.002, ИМХО следующая строка не будет равна предыдущей и вроде бы как надо добавить эту строку.
 Тут либо вами условие поставлено не правльно, либо все таки в результате должно быть 2 строки}
      end;
      RowS := RowS + 1;
    end;
  finally
    FreeAndNil(FListStart);
    FreeAndNil(FListRow1);
    FreeAndNil(FListRow2);
    FListResult.Text :=  StringReplace(FListResult.Text,' ',MaskColumn,[rfReplaceAll]);;
    ShowMessage(FListResult.Text);
    //FreeAndNil(FListResult);
  end;
end;
Для работы MatchStr требуется в блок Uses добавить StrUtils
Для работы StringReplace требуется в блок Uses добавить SysUtils
Для работы TStringList требуется в блок Uses добавить System.Classes

P/S
Для понимания, я вам расписал все по разным листам. В идеале весь код можно сильно сократить, используя 2 листа и метод удаления строки.
Пишу много и развернуто

Последний раз редактировалось Heneken87; 19.06.2017 в 10:23.
Heneken87 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как связать между собой 2 ComboBox'а? Stepan_P Microsoft Office Excel 1 02.06.2017 21:19
Соединение кнопок между собой линией nxnos Общие вопросы Delphi 42 16.08.2016 23:04
Комбинирование классов между собой monolit111 Общие вопросы C/C++ 9 29.07.2012 23:39
Как сравнить элементы 2 массивов между собой? DragonionS Общие вопросы Delphi 1 01.07.2007 21:49