Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.31;
Скачать: CL | DM;

Вниз

парсинг имени файла   Найти похожие ветки 

 
Scot Storch   (2010-08-05 16:30) [0]

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

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

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


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

PosEx и Copy.


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

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


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 18:34) [3]

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

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


 
KilkennyCat ©   (2010-08-05 18:44) [4]

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

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;


 
KilkennyCat ©   (2010-08-05 18:45) [5]


> 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;



Страницы: 1 вся ветка

Текущий архив: 2010.10.31;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.008 c
15-1279664536
Кто б сомневался
2010-07-21 02:22
2010.10.31
Права файлов на сервере


15-1279691795
xayam
2010-07-21 09:56
2010.10.31
Евгений Гик


2-1280989116
И. Павел
2010-08-05 10:18
2010.10.31
Не поддерживается выбранное объединение (MS Access, D7, ADO)


15-1280008661
картман
2010-07-25 01:57
2010.10.31
XSD-схемы


15-1279991329
SaveVideo
2010-07-24 21:08
2010.10.31
Не получается сохранить это видео