Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 946

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Подскажите, как реализовать следующее.
Есть каталог с расположенными в нем текстовыми файлами.
Наименование файлов:
1501000.txt
1508000.txt
1518000.txt
1545000.txt
1567000.txt
Как по очереди обработать каждый файл найдя его по первым 4
символам имени файла,
т.е. если файл начинается с 1501, то выполнить Procedure 1
если файл начинается с 1508, то сделать Procedure 2
и т.д.
С уважением
Al_Sha

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

DNK (статус: Студент), 22 января 2011, 21:34 [#1]:

Эта функция модуля SysUtils.

function Format(const Format: string; const Args: array of const): string; overload;
"Digital Networked Knight"
Al_Sha

Al_Sha (статус: Посетитель), 22 января 2011, 21:41 [#2]:

Спасибо большое, но непонятно это
'15%-.2d000.txt'
Как это...
DNK

DNK (статус: Студент), 22 января 2011, 21:50 [#3]:

Как расшифровывются форматирующие выражения подробно расписывается в справке к Delphi. В данном случае вместо %-.2d будет вставлено указанное в массиве число, при этом оно будет занимать два символа, выравнивание произойдет по правому краю, а недостающие символы заменяются нулями.
"Digital Networked Knight"
Al_Sha

Al_Sha (статус: Посетитель), 22 января 2011, 21:56 [#4]:

Спасибо,понял....
Вадим К

Вадим К (статус: Академик), 22 января 2011, 22:22 [#5]:

Алгоритм DNK немного своеобразен. представим, что в папке находиться всего то 10 файлов, а перебирать будем сотню. Но где гарантия, что в завтра кол-во файлов для перебора не увеличится заметно.
Но создавать сотню процедур... это конечно сильно. В моем варианте процедур может быть заметно меньше, и заметно легче модернизируется.

В целом, как академическое решение - оно то интересное. Но как практическое - ужасное.
Галочка "подтверждения прочтения" - вселенское зло.
DNK

DNK (статус: Студент), 22 января 2011, 22:28 [#6]:

Вадим К:

Цитата:

Но создавать сотню процедур... это конечно сильно. В моем варианте процедур может быть заметно меньше, и заметно легче модернизируется.
Создавать сотню процедур вовсе не обязательно. Для разных файлов можно указать одну процедуру.
"Digital Networked Knight"

22 января 2011, 22:48: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Судя по оценкам и комментариям, решено.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.03 сек.