Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > фиьтрация текстовых файлов


Автор: Martisha 19.12.2008, 14:30
Доброго вечера/дня..
Подскажите как можно осуществить фильтрацию
т.е. в папку помещаются текстовые файлы(добавляются), я их обрабатываю(разбиваю на поля), заношув бд..мне нужно чтобы обрабатывались только необработанные текстовые файлы.
Код

Procedure TForm1.ScanFolder(Dir:string);
Var
  SearchRec:TSearchRec;
  LocalTime: TFileTime;
  SysTime: TSystemTime;
begin
  if Dir<>'' then
              Dir:=IncludeTrailingPathDelimiter(Dir);
  if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
  try
   repeat
      begin
       if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.TXT' then
       begin
         FileTimeToLocalFileTime(SearchRec.FindData.ftLastWriteTime, LocalTime);
         FileTimeToSystemTime(LocalTime, SysTime);
         EditFile(Dir+SearchRec.name);
         EditDate(DateToStr(SystemTimeToDateTime(SysTime))+' '+TimeToStr(SystemTimeToDateTime(SysTime)));
       end;
      end;
   until
   FindNext(SearchRec)<>0;
  finally
  FindClose(SearchRec);
 end;
end;

здесь я вытаскиваю имя, датуи время создания файла
затем вызываются процедуры, которые помещают эти данные в листбоксы
Код

procedure TForm1.Button3Click(Sender: TObject);
begin
 ScanFolder('c:\ROU99STAT');
end;

procedure TForm1.EditFile(FileName:string);
begin
  ListBox1.Items.add(filename);
 end;

procedure TForm1.EditDate(FileDate:String);
begin
  ListBox3.Items.add(FileDate);
end;

вот на этом этапе вызываю процедуры для обработки и занесения в бд
Код

procedure TForm1.Button4Click(Sender: TObject);
Var  kol:Integer;
     kol1:Integer;
     i,j:Integer;
     FileText:String;
begin
Screen.Cursor := crHourGlass;
  try
    Application.ProcessMessages;
OraTable1.Active:=True;
kol:=Form1.ListBox1.Count;
  for i:=0 to kol-1 do
    begin
      FileText:=Form1.ListBox1.Items[i];
      ListBox2.Items.LoadFromFile(FileText);
        kol1:=Form1.ListBox2.Count;
              Form1.OraStoredProc2.Prepare;
              Form1.OraStoredProc2.ExecProc;
          for j:=3 to kol1-5 do
            begin
              if Length(ListBox2.Items[j])<>0 then
              begin
              OraTable1.Insert;
              OraTable1.FieldByName('datavremya').AsDateTime:=StrToDateTime(ListBox3.Items[i]);
              OraTable1.FieldByName('allfile').AsString:=ListBox2.Items[j];
              OraTable1.Post;
              end;
            end;
            Form1.OraStoredProc1.Prepare;
            Form1.OraStoredProc1.ExecProc;
     end;
  finally
    Screen.Cursor := crDefault;
end;

end;



я думаю сравнивать дату и время создания нового текстового файла с уже занесенными в бд..но как это осуществить не представляю!!! 

Автор: Petro123 19.12.2008, 14:48
Создай табличку, в которой будешь хранить имена загружаемых файлов. 
И после загрузки файла, перед тем как зафиксировать транзакцию, записывай в нее имя.

Добавлено через 2 минуты и 36 секунд
Причем именем файла пусть будет дата и время занесения в папку файла

Автор: Martisha 19.12.2008, 14:54
Petro123, спасибо, попробую)

Добавлено через 4 минуты и 4 секунды
Цитата(Petro123 @  19.12.2008,  14:48 Найти цитируемый пост)
Создай табличку, в которой будешь хранить имена загружаемых файлов.

а зачем создавать табличку? у меня в мою табличку ужа заносятся дата и время..просто я не знаю на каком этапе программы делать сравнение и как вообще можно сравнить данные из бд и данные из листбокса того же..

Автор: chaos 19.12.2008, 15:12
Martisha, может самый простой способ удалять\переносить файлы? обработала удалила\перенесла, обработала удалила\перенесла...

Автор: Martisha 19.12.2008, 15:18
Цитата(chaos @  19.12.2008,  15:12 Найти цитируемый пост)
обработала удалила\перенесла

обработала-перенесла..неплохо..надо подумать) спасибо за идею!

Автор: chaos 19.12.2008, 15:32
параноя smile)
правда может кто-нибудь ручками добавить файл в папку, например который уже был обработан smile))
тогда можно пойти следующим путем вести массив: имя файла, его crc и дальше уже смотреть.....

Автор: Martisha 22.12.2008, 08:40
Цитата(chaos @  19.12.2008,  15:32 Найти цитируемый пост)
правда может кто-нибудь ручками добавить файл в папку, например который уже был обработан ))

ну это врядли конечно

Цитата(chaos @  19.12.2008,  15:32 Найти цитируемый пост)
тогда можно пойти следующим путем вести массив: имя файла, его crc и дальше уже смотреть..... 

crc-эточто такое? ичто дальше смотреть?
не совсем идею поняла  smile 

Автор: Martisha 22.12.2008, 09:45
chaos, я тут вот о чем подумала..даже если
Цитата(chaos @  19.12.2008,  15:32 Найти цитируемый пост)
может кто-нибудь ручками добавить файл в папку, например который уже был обработан 

можно ж:
1) перемещать обработанный файл в другую папку
2) перед обработкой сравнивать с тем что обработано

Автор: Martisha 23.12.2008, 09:39
очевидно здесь эта тема теперь не актуальна, считаю этот вопрос закрытым!

Автор: Martisha 25.12.2008, 15:36
в общем создатьтаблицу с именами обработанных файлов все таки пришлось и естественно пришлось перед обработкой файла сравнивать его имя с именем из таблицы, я сделала так:
1) делаем индексацию в таблице с именами обработанных файлов
2)делаем сравнение перед обработкой файла:
Код

procedure TForm1.Button4Click(Sender: TObject);
Var  ...
       ...
     i,j:Integer;
     FileText:String;
begin
  try
      ...
      ...
  ORATable3.Active:=True;
  ORATable3.IndexFieldNames:='name';
  kol:=Form1.ListBox1.Count;
  for i:=0 to kol-1 do  //считываем из ListBox1 именами файлов кот.нужно обработать
    begin
        FileText:=Form1.ListBox1.Items[i];
          begin
            //делаем сравнение
          if ORATable3.FindKey([FileText]) then
              DeleteFile(FileText)   //если файл оработан, удаляем его из папки
                                           else
             begin
                //вызываем процедуры для обаботки файлов
             end;
         end;
    end;
  finally
end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)