Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 14.06.2017, 18:17   #1
andrey1234
Новичок
 
Регистрация: 05.03.2014
Сообщений: 3
Репутация: 10
По умолчанию Сравнить строки между собой в 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 в 23:43.
andrey1234 вне форума   Ответить с цитированием
Старый 14.06.2017, 18:34   #2
type_Oleg
Профессионал
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Адрес: Хазарский каганат
Сообщений: 2,353
Репутация: 1349
По умолчанию

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

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

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

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

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

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

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

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

Код:

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 в 11:23.
Heneken87 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




12:24.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru