|
Вопрос # 5 670/ вопрос решён / |
|
Здравствуйте!
Вообщем ситуация такая: необходима программка для обработки специфического текстового файла: в нём может быть около 10000 строк, состоящих из 14 символов. Необходимо загрузить содержимое в поле Мемо Main, дальше по нажатию кнопки "Проверить" сравнить все сроки друг с другом по символам с 4 по 11 и если они совпадают то удалить их их поля из Main(для последующего сохранения в отсортированный файл) и одновременно копировать: строка с "3" на конце (14 символ) в поле мемо "Closed", а с "2" в поле мемо "Open". К вопросу прилагаю принт скрин с пояснениями.
Заранее благодарен за помощь!
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: 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™ (статус: Доктор наук), 10 октября 2011, 14:03 [#21]:
Цитата (Rhasta):
а вы вместо того, чтобы оскорблять, тогда бы вообще не писали!
А я никого и не оскорблял. Это называется "сарказм".
Цитата (Rhasta):
такая помощь не особо то нужна
Я так понимаю, это вместо "спасибо", да?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Rhasta (статус: Посетитель), 10 октября 2011, 15:04 [#22]:
Сарказм — это насмешка, которая может открываться позитивным суждением, но в целом всегда содержит негативную окраску и указывает на недостаток человека, предмета или явления, то есть того, в отношении чего происходит.(Ключевое слово "Насмешка")
Кстати, я уже сказал всем спасибо, кто откликнулся и Вам в том числе.
|
|
min@y™ (статус: Доктор наук), 10 октября 2011, 15:12 [#23]:
Задавая детские вопросы в интернете, будь готов ко всему.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Rhasta (статус: Посетитель), 10 октября 2011, 15:15 [#24]:
Поэтому я и не люблю всевозможные форумы....
|
|
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]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|