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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2015, 10:31   #1
Kazik
Форумчанин
 
Регистрация: 27.05.2009
Сообщений: 192
По умолчанию Выборка из текстовых файлов

Есть код:
Код:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit4: TEdit;
    Label3: TLabel;
    Edit2: TEdit;
    Label4: TLabel;
    Edit3: TEdit;
    Label6: TLabel;
    Edit6: TEdit;
    Label7: TLabel;
    Edit7: TEdit;
    Label5: TLabel;
    Edit5: TEdit;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    Edit8: TEdit;
    Button2: TButton;
    GroupBox4: TGroupBox;
    Edit9: TEdit;
    Button1: TButton;
    procedure N4Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  f: TextFile;
  s: string;
  cells: array[1..7] of string;
  i, p: integer;
implementation

{$R *.dfm}

procedure TForm1.N4Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    begin
      AssignFile(f, opendialog1.FileName);
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Reset(f);
  while not eof(f) do
  begin
  readln(f, s);
  for i := 1 to 7 do begin
    p := pos(';', s);
    cells[i] := copy(s, 1, p - 1);
    delete(s, 1, p);
    if cells[1]=edit8.Text then
    begin
      if i=1 then edit1.Text:=cells[i];
      if i=2 then edit2.Text:=cells[i];
      if i=3 then edit3.Text:=cells[i];
      if i=4 then edit4.Text:=cells[i];
      if i=5 then edit5.Text:=cells[i];
      if i=6 then edit6.Text:=cells[i];
      if i=7 then edit7.Text:=cells[i];
    end;
  end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Reset(f);
  while not eof(f) do
  begin
  readln(f, s);
  for i := 1 to 7 do begin
    p := pos(';', s);
    cells[i] := copy(s, 1, p - 1);
    delete(s, 1, p);
    if cells[4]=edit9.Text then
    begin
      if i=1 then edit1.Text:=cells[i];
      if i=2 then edit2.Text:=cells[i];
      if i=3 then edit3.Text:=cells[i];
      if i=4 then edit4.Text:=cells[i];
      if i=5 then edit5.Text:=cells[i];
      if i=6 then edit6.Text:=cells[i];
      if i=7 then edit7.Text:=cells[i];
    end;
  end;
  end;
end;

end.
Данный код делает выборку по текстовому файлу (файл размером около 200Мб). Реализован поиск по идентификационному номеру и фамилии. С идентификационным номером все нормально, т.к. он уникален и не может повторяться. При выборке по фамилии не все так как хочу. Ибо он проходит весь файл и выдает мне последнюю запись. Как реализовать программу, чтобы он выдавал первое совпадение, а при повтрном нажатии на "Поиск" выдавал следующую запись?

Вот файл для примера:
Код:
4310139A000PB9;ГАЛИНА;АЛЕКСАНДРОВНА;КОШЕЛЬ;19390131;MH;0010330;17/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11400826;34;16;;137
4010139A000PB0;ОЛЬГА;ТИХОНОВНА;ДИВИНА;19390101;MH;0010359;17/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11400724;34;22;;28
4190639A000PB6;НИНА;АЛЕКСЕЕВНА;КАЗАЗЯН;19390619;MH;0010355;17/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11401062;34;74;2;14
4240439A000PB8;ТАМАРА;СЕМЁНОВНА;ЗОЛОТАРЁВА;19390424;MH;0010365;17/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11400173;34;70;;86
4260839A000PB2;ОЛЬГА;АНАТОЛЬЕВНА;ТКАЧЕНКО;19390826;MH;0010092;16/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11400161;34;6;;32
4312539A000PB9;ПЕТР;ИВАНОВИЧ;КОШЕЛЬ;19390131;MH;0010330;17/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11400826;34;16;;137
4010139A000PB1;АЛЕКСАНДР;СЕРГЕЕВИЧ;ДИВИН;19390101;MH;0010359;17/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11400724;34;22;;28
4152539A012PB5;ВАСИЛИЙ;ПЕТРОВИЧ;КАЗАЗЯН;19390619;MH;0010355;17/03/1995;ПЕРВОМАЙСКИЙ РОВД Г.МИНСКА;11200001;8;0;1;0;29;11100001;35;11906424;7;11700003;38;11401062;34;74;2;14
Kazik вне форума Ответить с цитированием
Старый 06.10.2015, 11:01   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

1) код слишком сложен не потому что он сложен или я тупой, а потому что его писали "попроще", а получили, как обычно, лапшу... лапша хороша только в тарелки, но не в коде или на ушах (с)
1.1) вынеси разбор строки в отдельную ф-ию, которая возвращает массив строк
1.2) вынеси заполнение полей в отдельную ф-ию
1.3) создай массив TEdit, заполни его в onCreate, и это уберёт тупые "if i = .... then Edit.." и п. 1.2 превратиться в 2 строки кода и 4 строки хлама (begin, end, procedure, var, i:......)
вот п. 1.2 и 1.3, если их не порукожопить, должны исправить многие глюки поиска

2) если нужно продолжить поиск, то нужно как-то сохранять последний результат, например, сохраняя айди (1е поле) записи и потом продолжая с него.... опять же, код писался "попроще", поэтому полностью адекватного решения я дать не могу (нажали пооиск 1 - поиск 2 - поиск 1.... как быть? если не менять весь код, то тут крайне сложно будет)
GreenWizard вне форума Ответить с цитированием
Старый 06.10.2015, 12:35   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Вот файл для примера
ДАй файл побольше, мегабайт на 10.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи на обработку файлов с данными, списков и текстовых файлов Диана96 Помощь студентам 1 26.12.2013 12:09
Сравнение текстовых файлов demon-sheff Общие вопросы Delphi 3 20.05.2013 09:13
Обработка текстовых файлов Funy Помощь студентам 2 13.12.2011 19:07
копирование текстовых файлов teacher Общие вопросы Delphi 4 16.02.2008 20:29
Сравнение текстовых файлов BR17UY Общие вопросы Delphi 15 07.05.2007 20:18