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

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

парсинг имени файла


Scot Storch ©   (2010-08-05 16:30:00) 

есть список имен файлов следующего формата:

'upd_-1_to_567.zip'
'upd_567_to_569.zip'
'upd_569_to_570.zip'

нужно, проходя по списку, извлекать из имени файла два целочисленных значения, т.е. например -1 и 567 для первого. Как грамотнее всего парсить строку.


KilkennyCat   (2010-08-05 18:45:00) [1]


> if ss then a := a + s[i] else b := b + s[i] else ss := true;

ошибка.
if ss then a := a + s[i] else b := b + s[i] else if a <> '' then ss := true;


KilkennyCat   (2010-08-05 18:44:00) [2]

если узкоспециализированно, то так быстрее:

s - входящая, а, b - выходящая
var
 i, L : integer;
 ss : boolean;
begin
 L := length(s);
 ss := false;
 for i := 0 to L do
   if s[i] in ['0'..'9', '-'] then
     if ss then a := a + s[i] else b := b + s[i] else ss := true;
end;


Юрий Зотов   (2010-08-05 18:34:00) [3]

1. Это лишнее:
Afile_name := ChangeFileExt(file_name, '');
Переменная Afile_name вообще не нужна.

2. Не предусмотрены возвращаемые значения для случая, когда
X<=0 или Y<=0 или Z<=0. Я бы поднимал исключение.


Scot Storch   (2010-08-05 18:19:00) [4]

Сделал как советовали:


procedure TForm1.Button2Click(Sender: TObject);

 procedure get_upd_range(const file_name: string; out vers_from,
   vers_to: string);
 var
   Afile_name: string;
   X, Y, Z: Integer;
 begin
   Afile_name := ChangeFileExt(file_name, '');
   X := PosEx('_', Afile_name);
   if X > 0 then
   begin
     Y := PosEx('_', Afile_name, X + 1);
     if Y > 0 then
     begin
       Z := PosEx('_', Afile_name, Y + 1);
       if Z > 0 then
       begin
         vers_from := Copy(Afile_name, X + 1, Y - 1 - X);
         vers_to   := Copy(Afile_name, Z + 1, Length(Afile_name) - Z);
       end;
     end;
   end;
 end;

var
 vers_from, vers_to: string;
begin
 get_upd_range('upd_-1_to_659.zip', vers_from, vers_to);
 ShowMessage(vers_from + #13#10 + vers_to);
end;


Вроде работает как надо, ток складывается впечатление что слишком громоздко или я ошибаюсь?


Юрий Зотов   (2010-08-05 16:33:00) [5]

PosEx и Copy.


Наверх

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