Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

парсин строки имени файла


DL ©   (2009-12-23 13:03:00) 

Имеется список строк формата:

 Attach_<ID>_<DateTime>.zip,

 например:

 'Attach_417_23_12_2009_11_52_31.zip'.

Задача: из строки извлечь ID и DateTime. Вопрос, сообственно, в слдующем: какой подход грамотнее всего использовать при парсинге: RegExp'ы или же простые PosEx, Copy.


Palladin   (2009-12-23 20:52:00) [1]


> Так что выбор зависит от задачи

Выбор зависит не от задачи, а от ее условий. Условия описаны ОДНОЗНАЧНЫЕ, алгоритм парсинга ОДНОЗНАЧНЫЙ, без ДВУСМЫСЛЕНОСТЕЙ. Электролампочки и ЛЭП станции тут нет.


TUser   (2009-12-23 17:33:00) [2]

На правах имхи

> Применение РВ для такой детской задачки подобно стрельбе
> из пушки по воробьям.

Применение электростанции+ЛЭП+лампочки тоже похоже на стрельбу их пушки по воробьям. И в программировании, вроде, очень похоже: например, для реализации массива нужен указатель и индексная арифметка. Но люди создают объекты, которые внутрь себя массив оборачивают. И всякий там TList при создании выделяет себе больше памяти, чем "нужно" и выполняет множество "лишнего" кода. Чисто стрельба из пушки.

Выбор любого инструмента определяется альтернативными издержками. А именно: 1. Насколько долго/трудно его заюзать и отладить. 2. Насколько быстро будет работать (варианты - сколько использует памяти, других ресурсов, насколько точный результат выдаст). Например, все, что угодно можно написать на асме, но долго писать. И в большинстве случаев выигрышь в скорости и в прочем будет не критичным. Ну будет программа записать не 360 Кб, а 1, а оно нафиг не надо. Аналогично и в другую сторону, - искать подстроку регэкспами, гораздо проще Боера-Мура, только тормознутее.

Так что выбор зависит от задачи. Если некое место в программе критично, то надо написать все ручками, гораздо оптимальнее стандартных pos/copy, а если не критично, то надо выбрать то, что проще писать. А последнее, к тому же, от конкретного писателя зависит.


DL   (2009-12-23 15:46:00) [3]

сделал так:


procedure TForm4.Button1Click(Sender: TObject);

 procedure PharsePacketName(const PacketName: string; out ID: Integer;
   out Received: TDateTime);
 begin
   with TStringList.Create do
     try
       Delimiter := '_';
       DelimitedText := PacketName;
       ID := StrToIntDef(Strings[1], -1);
       Received := EncodeDateTime(
         StrToIntDef(Strings[4], -1),
         StrToIntDef(Strings[3], -1),
         StrToIntDef(Strings[2], -1),
         StrToIntDef(Strings[5], -1),
         StrToIntDef(Strings[6], -1),
         StrToIntDef(Strings[7], -1), 0);
     finally
       Free;
     end;
 end;

var
 ID: Integer;
 Received: TDateTime;
begin
 PharsePacketName('attach_417_23_12_2009_13_50_04', ID, Received);
 ShowMessageFmt('ID: %d; Received: %s', [ID, DateTimeToStr(Received)]);
end;


Демо   (2009-12-23 15:26:00) [4]

Судя по формату - достаточно двух функций Copy.


Юрий Зотов   (2009-12-23 14:54:00) [5]

> какой подход грамотнее всего использовать при
> парсинге: RegExp'ы или же простые PosEx, Copy

Применение РВ для такой детской задачки подобно стрельбе из пушки по воробьям.

> регэкспами проще, конечно.

???????????
Не наоборот?


MBo   (2009-12-23 14:07:00) [6]

если формат жесткий, то регэкспы - излишество, достаточно разделения строки с помощью TStringList.DelimitedText


DL   (2009-12-23 13:34:00) [7]

с подходом определился. спасибо. теперь надо бы определиться с библиотекой для работы с regexp'ами. что посоветуете?


RWolf   (2009-12-23 13:11:00) [8]

регэкспами проще, конечно.
правда, размер программы подрастёт.


Наверх

Титульная страница Поиск, карта сайта Написать письмо