Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 670

/ вопрос решён /

Здравствуйте!

Вообщем ситуация такая: необходима программка для обработки специфического текстового файла: в нём может быть около 10000 строк, состоящих из 14 символов. Необходимо загрузить содержимое в поле Мемо Main, дальше по нажатию кнопки "Проверить" сравнить все сроки друг с другом по символам с 4 по 11 и если они совпадают то удалить их их поля из Main(для последующего сохранения в отсортированный файл) и одновременно копировать: строка с "3" на конце (14 символ) в поле мемо "Closed", а с "2" в поле мемо "Open". К вопросу прилагаю принт скрин с пояснениями.
Заранее благодарен за помощь!

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Rhasta Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Rhasta (статус: Посетитель)
Вопрос отправлен: 8 октября 2011, 21:48
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: ierihon1

Здравствуйте, Rhasta! Вот конечный вариант алгоритма:

function CompareStrings(S1,S2:string):Boolean;
begin
  Delete(S1,1,3); Delete(S1,12,3);
  Delete(S2,1,3); Delete(S2,14,3);
  if S1 = S2 then
    Result:=True
  else
    Result:=False;
end;
 
procedure TForm11.btn1Click(Sender: TObject);
var i,j:Integer;
begin
  mmo2.Clear;
  mmo3.Clear;
  for i := 0 to mmo1.Lines.Count - 1 do
    for j := 0 to mmo1.Lines.Count - 1 do
      if i <> j then
        if CompareStrings(mmo1.Lines[i],mmo1.Lines[j]) then
        begin
          if mmo1.Lines[i][14] = '2' then
            mmo2.Lines.Add(mmo1.Lines[i]);
          if mmo1.Lines[i][14] = '3' then
            mmo3.Lines.Add(mmo1.Lines[i]);
          mmo1.Lines.Delete(i);
        end;
end;

Ответ отправил: ierihon1 (статус: 1-ый класс)
Время отправки: 8 октября 2011, 22:43
Оценка за ответ: 5

Комментарий к оценке: Кое что подправил, но за идею спасибо

Ответ #2. Отвечает эксперт: Drinkenz

Здравствуйте, Rhasta!

function CompareStrings(S1,S2:string):Boolean;
begin
  Delete(S1,14,1);
  Delete(S1,1,3);
  Delete(S2,14,1);
  Delete(S2,1,3);
  Result:=S1=S2;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:Integer;
    savmemo,delmemo: tstringlist;
    f1,f2: boolean;
begin
  savmemo:=TStringList.Create();
  delmemo:=TStringList.Create();
  memo2.Clear;
  memo3.Clear;
  i:=0;
  while i<(memo1.Lines.Count-2) do begin
    f1:=false;
    f2:=true; // restore i
    for j:=i+1 to memo1.Lines.Count-1 do
      if CompareStrings(memo1.Lines[i],memo1.Lines[j]) then begin
         f1:=true;
         delmemo.add(memo1.Lines[j]);
         end
         else
         savmemo.add(memo1.Lines[j]);
 
    if f1 then begin
      f2:=false; // мемо1 в  на переделку
      delmemo.add(memo1.Lines[i])
      end
      else
      savmemo.add(memo1.Lines[i]); //  строка уникальна!
 
    for k:=0 to delmemo.count-1 do
      case delmemo.strings[k][14]of
        '2': memo2.Lines.Add(delmemo.strings[k]);
        '3': memo3.Lines.Add(delmemo.strings[k]);
        end;
    delmemo.Clear;
    memo1.lines.assign(savmemo);
    if f2 then inc(i);
    savmemo.Clear;
    end;
 
  delmemo.Free;
  savmemo.Free;
end;

Ответ отправил: Drinkenz (статус: 1-ый класс)
Время отправки: 9 октября 2011, 01:10


Мини-форум вопроса

Всего сообщений: 25; последнее сообщение — 13 октября 2011, 15:59; участников в обсуждении: 4.

Страницы: [« Предыдущая] [1] [2]

min@y™

min@y™ (статус: Доктор наук), 10 октября 2011, 14:03 [#21]:

Цитата (Rhasta):

а вы вместо того, чтобы оскорблять, тогда бы вообще не писали!

А я никого и не оскорблял. Это называется "сарказм".

Цитата (Rhasta):

такая помощь не особо то нужна

Я так понимаю, это вместо "спасибо", да?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Rhasta

Rhasta (статус: Посетитель), 10 октября 2011, 15:04 [#22]:

Сарказм — это насмешка, которая может открываться позитивным суждением, но в целом всегда содержит негативную окраску и указывает на недостаток человека, предмета или явления, то есть того, в отношении чего происходит.(Ключевое слово "Насмешка")
Кстати, я уже сказал всем спасибо, кто откликнулся и Вам в том числе.
min@y™

min@y™ (статус: Доктор наук), 10 октября 2011, 15:12 [#23]:

Задавая детские вопросы в интернете, будь готов ко всему.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Rhasta

Rhasta (статус: Посетитель), 10 октября 2011, 15:15 [#24]:

Поэтому я и не люблю всевозможные форумы....
Rhasta

Rhasta (статус: Посетитель), 13 октября 2011, 15:59 [#25]:

Закрываю вопрос, всем спасибо, кто откликнулся. Кому интересно, то немного быстрее всё работает, если сделать так:
procedure TForm1.Button2Click(Sender: TObject);
var
 i,j,key:integer;
 x,y:string;
begin
 listbox2.Clear;
 listbox3.Clear;
 key:=0;
 i:=0;
 j:=1;
 
 while i < listbox1.Items.Count-1 do
  begin
   while j < listbox1.Items.Count do
    begin
     x:=listbox1.Items[i];
     y:=listbox1.Items[j];
     if copy(x,4,8)=copy(y,4,8)
      then
       begin
        key:=1;
        if y[14]='2'
         then listbox2.Items.Add(y)
         else listbox3.Items.Add(y);
        listbox1.items.Delete(j);
        j:=listbox1.Items.Count;
       end;
    j:=j+1;
 
    end;
   if key=1
    then
     begin
      key:=0;
      if x[14]='2'
         then listbox2.Items.Add(x)
         else listbox3.Items.Add(x);
        listbox1.items.Delete(i);
        i:=i-1;
     end;
  i:=i+1;
  j:=i+1;
  end;
label1.Caption:=inttostr(listbox1.Items.Count);
label2.Caption:=inttostr(listbox2.Items.Count);
label3.Caption:=inttostr(listbox3.Items.Count);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
x:string;
begin
 i:=0;
 while i < listbox1.Items.Count do
  begin
   x:=listbox1.Items[i];
    if x[14]='2'
     then
      begin
       listbox1.items.Delete(i);
       i:=i-1;
      end;
   i:=i+1;
  end;
  label1.Caption:=inttostr(listbox1.Items.Count);
end;

13 октября 2011, 16:11: Статус вопроса изменён на решённый (изменил автор вопроса — Rhasta): Более рациональное решения нашёл в другом источнике

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 01:07
Выполнено за 0.04 сек.