![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
парсинг имени файла
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.