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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2009, 13:53   #1
Leksda
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 14
По умолчанию Помогите оптимизировать прогу(работа с файлом)

суть задачи такова
есть текстовый файл размером около 1,5-3 Мб, в файле данные о сотрудниках, кол-во строк >60000
нужно из этого файла выбрать все строки относящиеся к сотруднику и сохранить их в отдельном файле где название будет его имя,плюс к этому необходимо отредактировать файл - результат (убрать ненужные строки)
написал сл. код, программа выполняется с файлом до 500кб, помогите оптимизировать!!

Код:
RichEdit1.Lines.LoadFromFile(fname); //загружаем файл в richedit
     for I := 0 to RichEdit1.Lines.Count - 1 do
     begin
       temp:=RichEdit1.Lines[i];

      if pos ('Reg #      ', temp) <> 0 then  {поиск строк с которой начать копировать}
        t:= RichEdit1.Lines.IndexOf(temp);
      if pos ('Your payment', temp)<> 0 then {до которой копировать}
        p:= RichEdit1.Lines.IndexOf(temp);
        {цикл для найденных строк}
      if (t<>0) and (p<>0) then
        begin
          for x := t-2 to p do
            begin
            {копирование строк по имени клиента}
              s:=RichEdit1.Lines[x];
              memo2.Lines.Add(s); //вставляем в мемо2 необходимые строки
              fname1:=RichEdit1.Lines[t-2]; //имя файла для сохранения
              delete(fname1,1,64);
            end;
          {редактирование файла}
              for a := 0 to memo2.lines.Count - 1 do
                begin
                  s1:= memo2.Lines[a];
                  if pos('Page 1 of', s1)<>0 then
                    begin
                      b:=memo2.Lines.IndexOf(s1);
                      for c := b-2 to b+12 do
                      memo2.Lines.Delete(b-2); {вырезаем ненужные строки}
                    end;
                end;
          memo2.Lines.SaveToFile(fname1+'.txt');// сохранить файл
          memo2.Clear; //очищаем мемо для следующего сотрудника
          t:=0;
          p:=0; 
        end;
     end;
оказалось, что апостолов просто колбасило...
Leksda вне форума Ответить с цитированием
Старый 01.04.2009, 14:31   #2
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

1) для хранения данных о сотрудниках лучше использовать Базы Данных
2) memo2 используется как буфер.. лучше вмест него использовать переменную типа TStrings, работа с нею значительно быстрее чем с мемо
3) идет много обращений к тексту рич эдита.. лучше сначала перегнать весь текст в буферную переменную типа TStrings и потом работать с нею..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 01.04.2009, 16:55   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
лучше вмест него использовать переменную типа TStrings
Вообще то это абстрактный класс. Лучше TStringList.

Кстати я бы использовал простейший Readln+Pos.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.04.2009, 18:13   #4
CahekG
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 28
По умолчанию

Возможно из-за этого не работает:
Код:
memo2.Lines.Delete(b-2); {вырезаем ненужные строки}
Изменеение memo2.lines.Count в теле цикла уже не повлияет на реальное количество итераций цикла. Это может и приводит к ошибке, которая не даёт работать. Например где-то в тексте 'Page 1 of' встречается ближе к концу информации переданой в memo2, а после удаления строк
Код:
s1:= memo2.Lines[a];
обращается к несуществующей строке

Если это разовый проект и нет опыта работы с БД, то для современного компа без ошибок в коде это не должно вызвать особых задержек во времени.
CahekG вне форума Ответить с цитированием
Старый 01.04.2009, 18:16   #5
Leksda
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 14
По умолчанию

дело в том, что файл получается путем выписки из БД, к которой доступа нет. и прога рабочая, просто если исходный файл больше чем 2000 - 3000 строк, то обработка занимает оч. много времени, (если файл содержит около 6000 строк время порядка 20-25 мин!) а кол-во строк в дальнейшем будет только увеличиваться...
оказалось, что апостолов просто колбасило...

Последний раз редактировалось Leksda; 01.04.2009 в 18:19.
Leksda вне форума Ответить с цитированием
Старый 01.04.2009, 22:57   #6
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Неплохо было бы посмотреть структуру файла для начала
s.Creator вне форума Ответить с цитированием
Старый 02.04.2009, 00:44   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Leksda, попробуйте всё таки прислушаться к вышеданным советам:
проверьте такой код сколько будет выполняться:
Код:
var
  TS, TOut : TStringList; 
  i : integer;
begin
  TS := TStringList.Create;
  TOut := TStringList.Create;
  TS.LoadFromFile('вашфайл.txt');
  for i:=0 to TS.Count-1 do
    if Pos('Сотрудника табельный номер',TS.Strings[i])>0 then
      TOut.Add(TS.Strings[i]);
  TOut.SaveToFile('Выходной_файл.txt')
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.04.2009, 09:27   #8
Leksda
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 14
По умолчанию

Serge_Bliznykov
спасибо!
оказалось, что апостолов просто колбасило...
Leksda вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Делфи - работа с файлом Лунатик222 Помощь студентам 8 23.01.2009 22:14
Работа с файлом в C Mishka Помощь студентам 2 22.07.2008 13:28
Кто поможет оптимизировать прогу, а то я уже оптимизировал как мог :) Droid Помощь студентам 7 12.05.2008 20:56
работа с txt файлом ShenDy Общие вопросы C/C++ 1 08.04.2008 22:55
Работа с текстовым файлом (delphi). Помогите доделать программу. Snord Помощь студентам 1 14.12.2007 14:10