| 
| 
 | Вопрос # 4 946/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!Подскажите, как реализовать следующее.
 Есть каталог с расположенными в нем текстовыми файлами.
 Наименование файлов:
 1501000.txt
 1508000.txt
 1518000.txt
 1545000.txt
 1567000.txt
 Как по очереди обработать каждый файл найдя его по первым 4
 символам имени файла,
 т.е. если файл начинается с 1501, то выполнить Procedure 1
 если файл начинается с 1508, то сделать Procedure 2
 и т.д.
 С уважением
 Al_Sha
 
|  |   Вопрос задал: Al_Sha (статус: Посетитель)Вопрос отправлен: 22 января 2011, 20:16
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Al_Sha!Где то так
 
 var
  searchResult : TSearchRec;
  k:integer;
begin
  // Пытаемся найти правильные файлы, соответствующие *.txt в текущем каталоге
  if FindFirst('*.txt', faAnyFile, searchResult) = 0 then
  begin
    repeat
      //ShowMessage(Имя файла = '+searchResult.Name);
      k := strtointdef(copy(searchResult.Name, 1,4), -1);
      case k of
        -1: procZ(searchResult.Name);
        1500: proc1(searchResult.Name);
        1501: proc2(searchResult.Name);
        1502: proc3(searchResult.Name);
      else
        procx(searchResult.Name);
      end;
    until FindNext(searchResult) <> 0;
 
    // Должен освободить ресурсы, используемые этими успешными, поисками
    FindClose(searchResult);
  end;
end;
 
procedure proc1(fn:string);
begin
 
end;procx - это процедура для обработки файлов, которые не попали в список "избранных".
 procZ - это процедура для обработки файлов, которые имеют имя, первые 4 символа которого не являются цифрами.
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 22 января 2011, 20:47
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо большое...То, что нужно
 |  Ответ #2. Отвечает эксперт: DNK Здравствуйте, Al_Sha!Вариант №2.
 
 
 procedure Proc0(FileName: string);
begin
 ...
end;
 
...
 
procedure Proc99(FileName: string);
begin
 ...
end;
 
type
  TProc = procedure(FileName: string);
 
const
  // Для файла с нужным номером указывается нужная процедура
  PROC_ARRAY: array [0..99] of TProc =
    (Proc0, Proc1, Proc2, Proc3, Proc4, Proc5, Proc6, Proc7, Proc8, Proc9,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0, Proc0,
     Proc90, Proc91, Proc92, Proc93, Proc94, Proc95, Proc96, Proc97, Proc98, Proc99);
 
begin
  for i := Low(PROC_ARRAY) to High(PROC_ARRAY) do begin
    name := format('15%-.2d000.txt', [i]);
    if FileExists(name) then
      PROC_ARRAY[i](name);
  end;
end;
|  | Ответ отправил: DNK (статус: Студент)Время отправки: 22 января 2011, 21:24
 Оценка за ответ: 5
 Комментарий к оценке: Благодарю...Немного непонятно с форматами NAME, надо разобраться.
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 22 января 2011, 22:28; участников в обсуждении: 3. 
|   | DNK (статус: Студент), 22 января 2011, 21:34 [#1]:Эта функция модуля SysUtils. 
 
 function Format(const Format: string; const Args: array of const): string; overload; "Digital Networked Knight" |  
|   | Al_Sha (статус: Посетитель), 22 января 2011, 21:41 [#2]:Спасибо большое, но непонятно это '15%-.2d000.txt'
 Как это...
 |  
|   | DNK (статус: Студент), 22 января 2011, 21:50 [#3]:Как расшифровывются форматирующие выражения подробно расписывается в справке к Delphi. В данном случае вместо %-.2d будет вставлено указанное в массиве число, при этом оно будет занимать два символа, выравнивание произойдет по правому краю, а недостающие символы заменяются нулями. "Digital Networked Knight" |  
|   | Al_Sha (статус: Посетитель), 22 января 2011, 21:56 [#4]:Спасибо,понял.... |  
|   | Вадим К (статус: Академик), 22 января 2011, 22:22 [#5]:Алгоритм DNK немного своеобразен. представим, что в папке находиться всего то 10 файлов, а перебирать будем сотню. Но где гарантия, что в завтра кол-во файлов для перебора не увеличится заметно. Но создавать сотню процедур... это конечно сильно. В моем варианте процедур может быть заметно меньше, и заметно легче модернизируется.
 
 В целом, как академическое решение - оно то интересное. Но как практическое - ужасное.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | DNK (статус: Студент), 22 января 2011, 22:28 [#6]:Вадим К: Цитата: Но создавать сотню процедур... это конечно сильно. В моем варианте процедур может быть заметно меньше, и заметно легче модернизируется.Создавать сотню процедур вовсе не обязательно. Для разных файлов можно указать одну процедуру. "Digital Networked Knight" |  22 января 2011, 22:48: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Судя по оценкам и комментариям, решено. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |